2009-05-23 17 views
6

के साथ निर्माता उपभोक्ता समस्या मेरे पास कोर डेटा एप्लिकेशन है। निर्माता धागे में, मैं एक वेब सेवा से डेटा खींचता हूं और इसे अपने ऑब्जेक्ट में स्टोर करता हूं और सेव करता हूं। मेरा उपभोक्ता ऑब्जेक्ट एक टेबल व्यू कंट्रोलर है जो इसे प्रदर्शित करता है। हालांकि, ऐप्लिकेशन क्रैश और मैं NSFetchedResultsController त्रुटि: वस्तु को खोजने के लिए उम्मीद (इकाई: FeedEntry; आईडी: 0xf46f40; डेटा:) में खंड (शून्य) को हटाए जानेकोर डेटा

कंसोल पर

के लिए। जब मैं इसे डीबग करता हूं, सब कुछ ठीक काम करता है। तो मुझे समझ में आया कि यह एक दौड़ मुद्दे की तरह है।

इस तरह की समस्या का समाधान कैसे किया जाता है? कोर-डेटा के साथ निर्माता-उपभोक्ता ऐप को डिज़ाइन करने का सबसे अच्छा तरीका क्या है?

उत्तर

16

यदि आप तेंदुए को लक्षित कर रहे हैं या बाद में, ऐप्पल ने चीजों को एक स्पर्श आसान बना दिया है।

अपने निर्माता धागे में आपके मुख्य थ्रेड में एमओसी के समान पीएससी के साथ एक एमओसी बनाएं। आप इस थ्रेड में ऑब्जेक्ट्स को अपने webservice से खींच सकते हैं, नई ऑब्जेक्ट्स बना सकते हैं, और उन्हें सामान्य के रूप में सहेज सकते हैं।

अपने उपभोक्ता धागे में, अपने नियंत्रक को NSManagedObjectContextDidSaveNotification के लिए पर्यवेक्षक के रूप में जोड़ें। आपका कॉलबैक कुछ ऐसा दिखाई देगा:

- (void) managedObjectContextDidSave:(NSNotification *)notification 
{ 
    NSManagedObjectContext *managedObjectContext = [notification object]; 
    if(managedObjectContext != self.managedObjectContext) 
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

इस तरह, निर्माता धागा में सहेजी गई वस्तुओं स्वचालित रूप से अपने उपभोक्ता धागा हासिल कर लिया जाएगा।

+1

धन्यवाद sbooth ... आपका जवाब सही था ... दूसरों के लिए, NSManagedObjectContextDidSaveNotification की सदस्यता के लिए, निम्न कोड जोड़ ... \t \t [[NSNotificationCenter defaultCenter] addObserver: AppDelegate \t \t \t \t \t \t \t \t \t \t \t \t चयनकर्ता: @selector (managedObjectContextDidSave :) \t 0,123,\t \t \t \t \t \t \t \t \t \t \t नाम: NSManagedObjectContextDidSaveNotification \t \t \t \t \t \t \t \t \t \t \t \t वस्तु: स्वयं।managedObjectContext]; – Mugunth

+2

@ मुगुनथ कुमार, चूंकि वह जांच कर रहा है कि यह किस संदर्भ में है, आपको शायद ऑब्जेक्ट परम के लिए शून्य पास करनी चाहिए, आप बीजी थ्रेड के लिए बनाए गए नए संदर्भ को नहीं देखना चाहते हैं, जो ऐप प्रतिनिधि के संदर्भ में नहीं है। – marchinram

+0

बिल्कुल वही जो मैं खोज रहा था। धन्यवाद। – JHollanti

0

कोर डेटा आम तौर पर धागा सुरक्षित नहीं है। मेरी वरीयता पृष्ठभूमि थ्रेड पर न्यूनतम काम करना होगा, और कोर डेटा इकाइयों को मुख्य थ्रेड में बनाने के लिए आवश्यक डेटा को पास करना होगा जब आप इसे अपनी वेब सेवा से पुनर्प्राप्त कर लेंगे। हालांकि, this document पर एक नज़र डालें। यदि आपको आवश्यकता हो तो थ्रेड में कोर डेटा का उपयोग करने के लिए कुछ रणनीतियां हैं।

+0

"कोर डेटा आम तौर पर थ्रेड सुरक्षित नहीं है" बल्कि भ्रामक है। यदि आप प्रत्येक धागे के लिए एक संदर्भ बनाते हैं (या प्रत्येक ऑपरेशन; संदर्भ बहुत हल्के होते हैं) शेष कोर डेटा फ्रेमवर्क बाकी सब कुछ का ख्याल रखता है (आपको बस इतना करना है कि उपरोक्त वर्णित एनएसएमएनेज ऑब्जेक्ट कॉन्टेक्स्टडिडसेव नोटिफिकेशन को संभालना है)। – hatfinch

+0

मैं मानता हूं, यह बहुत भ्रामक है। – JHollanti