this question में डैनियल एगर्ट के जवाब के अनुसार, जब NSPrivateQueueConcurrencyType
साथ यह कुछ भी कि छू लेती है यह या वस्तुओं है कि भीतर performBlock:
या performBlockAndWait:
क्या NSMainQueueConcurrencyType का उपयोग करते समय कोर डेटा को प्रदर्शनब्लॉक के भीतर पढ़ना आवश्यक है?
यह के हैं NSMainQueueConcurrencyType
के लिए एक ही सच है क्या करने के लिए आवश्यक है एक प्रबंधित वस्तु संदर्भ का उपयोग करते हुए? निम्नलिखित कोड मुख्य थ्रेड पर चल रहा कल्पना कीजिए, उदाहरण के लिए एक UIViewController में:
self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease];
//moc setup
__block RHWidget *widget = nil;
[self.moc performBlockAndWait:^{
widget = [(RHWidget *)[self.moc objectWithID:self.widgetObjectID] retain];
}];
self.labelView.text = widget.descriptionString;
[widget release];
यह ब्लॉक के बाहर विजेट का उपयोग करने के लिए सुरक्षित है, क्योंकि हम जानते हैं कि हम मुख्य थ्रेड पर कर रहे हैं?
__block NSString *description = nil;
[self.moc performBlockAndWait:^{
RHWidget *widget = (RHWidget *)[self.moc objectWithID:self.widgetObjectID];
description = [widget.descriptionString copy];
}];
self.labelView.text = description;
[description release];
चीजों को बदलना है अगर वहाँ निजी क़तार प्रकार की संभवतः एक और NSManagedObjectContext
नहीं है, तो, ब्लॉक में काम कर रही है और एक parentContext
रूप self.moc में परिवर्तन को धक्का: या यह यह यह करने के लिए आवश्यक है?
यह पाठ्यक्रम का थोड़ा सा उदाहरण है, लेकिन यह विजेट को सुरक्षित रूप से पास करना अच्छा होगा, उदाहरण के लिए, एक मोडल व्यू कंट्रोलर जिसे विजेट के कुछ गुणों तक पहुंचने की आवश्यकता है। क्या मुझे विजेट के ऑब्जेक्ट आईडी को पास करना होगा और इसे नए व्यू कंट्रोलर में performBlock:
के भीतर रीफ्रेट करना चाहिए?
एक बहुत व्यापक लेख है [यहां] (http://www.cocoanetics.com/2012/07/multi-context-coredata/) जो संदर्भ समरूपता प्रकारों और घोंसले वाले संदर्भों सहित विभिन्न दृष्टिकोणों का वर्णन करता है। –