2012-05-04 8 views
8

पर NSManagedObjectContext के लिए NSPrivateQueueConcurrencyType और NSMainQueueConcurrencyType प्रकार का उपयोग कर, इसे सुरक्षित नेस्ट performBlock बनाने के लिए है उसी संदर्भ पर कॉल?नेस्टेड performBlock: NSManagedObjectContext

[backgroundContext performBlock:^{ 
    NSFetchRequest *myRequest = ...; 
    __block NSArray *result= nil; 
    [backgroundContext performBlockAndWait:^{ 
     results = [backgroundContext executeFetchRequest:myRequest error:NULL]; 
    }]; 
}]; 

यह बेवकूफ लग सकता है, लेकिन मैं सहायकों तरीकों जो executeFetchRequest कॉल संपुटित का एक बहुत साथ एक मौजूदा codebase है। मैं इस बारे में धारणा नहीं बनाना चाहता हूं कि कॉलर पहले से ही प्रदर्शन का उपयोग कर चुका है या नहीं। उदाहरण के लिए:

-(void)updateObjects:(BOOL)synchronous 
{ 
    if (YES == synchronous) 
     [self fetchHelper]; 
    else 
    { 
     [backgroundContext performBlock:^{ 
      [self fetchHelper]; 
     }]; 
    } 
} 

-(NSArray*)fetchHelper 
{ 
    [self.backgroundContext performBlockAndWait:^{ 
     //Fetch the objects... 
     [self.backgroundContext executeFetchRequest: (...)]; 
    }]; 
} 

मैं इसे करने की कोशिश की है और यह काम करता है। लेकिन मैंने कोर डेटा और बहु-थ्रेडिंग के साथ बहुत सावधान रहने के लिए (कठिन तरीका) सीखा है।

उत्तर

8

हां, performBlockAndWait पुनर्वित्त है। सीधे एप्पल के रिलीज नोट्स से ...

कोर डाटा नए विकल्पों के साथ NSManagedObjectContext वर्ग के लिए संगामिति मॉडल formalizes। जब आप संदर्भ बनाते हैं, तो आप इसके साथ उपयोग करने के लिए समवर्ती पैटर्न निर्दिष्ट कर सकते हैं: थ्रेड कैदीन, एक निजी प्रेषण कतार, या मुख्य प्रेषण कतार। NSConfinementConcurrencyType विकल्प 5.012 से पहले आईओएस के संस्करणों पर मौजूद व्यवहार प्रदान करता है और डिफ़ॉल्ट है। कतार एसोसिएशन के साथ बनाए गए संदर्भ में संदेश भेजते समय, आपको प्रदर्शनब्लॉक का उपयोग करना होगा: या प्रदर्शनब्लॉक एंडवेट: विधि यदि आपका कोड उस कतार पर पहले से निष्पादित नहीं हो रहा है ( मुख्य कतार प्रकार के लिए) या किसी प्रदर्शनब्लॉक के दायरे में। .. आमंत्रण (निजी कतार प्रकार के लिए)। उन विधियों को पारित ब्लॉक के भीतर, आप स्वतंत्र रूप से NSManagedObjectContext के तरीकों का उपयोग कर सकते हैं। performBlockAndWait: विधि एपीआई पुनर्वितरण का समर्थन करता है। प्रदर्शनब्लॉक: विधि में एक ऑटोरेलीज पूल शामिल है और प्रक्रिया को पूरा करने पर PendingChanges विधि को कॉल करता है।

+0

प्रदर्शनब्लॉक के बारे में क्या, क्या वह पुनर्विक्रेता भी है? – malhal

+0

ऐसा नहीं है, यह सत्र में शामिल है। यदि आप performBlock को कॉल करते हैं तो यह अनुरोध कतारबद्ध होगा क्योंकि यह async है। –

+0

बस स्पष्ट होने के लिए, कोड के दूसरे बिट में ओपी क्या कर रहा है ठीक है ?, लेकिन यदि दोनों विधियों में "प्रदर्शनब्लॉक" था तो यह समस्याएं पैदा कर सकता है? क्या यह देखने का सही तरीका है? – hokkuk

संबंधित मुद्दे