2012-08-25 22 views
5

के लिए एनएसओपेरेशन वीएस जीसीडी एक ऐसी स्थिति के लिए अधिक उपयुक्त है जहां डेटा को कोर-डेटा में एक थ्रेड पर संग्रहीत करने की आवश्यकता होती है और कोर-डेटा से दूसरे पर पढ़ा जाता है?कोर-डेटा

मैं जीसीडी के बारे में सोच रहा था लेकिन यह प्रत्येक थ्रेड के लिए NSManagedObjectContext के निर्माण के साथ कैसे काम करता है? एक कतार में इन वस्तुओं को कैसे बनाते हैं?

विभिन्न थ्रेड पर परिवर्तन किए जाने पर डेटा स्टोर को अपडेट/सिंक किया जाना चाहिए, क्या यह जीसीडी या एनएसओपरेशन के साथ बेहतर है?

मैं स्टोर को दूषित करने या स्टोर के विभिन्न संस्करणों के साथ मुद्दों के बिना आवश्यकतानुसार डेटा स्टोर को पढ़ने और लिखने के दौरान 2 कतारों में ब्लॉक पास करने में सक्षम होना चाहता हूं।

उत्तर

16

GCD और NSOperation के बीच बहस मूल रूप से उपयोग करने का तर्क करने पर निर्भर करता अमूर्तता का उच्चतम स्तर जो आपको एक अच्छा समाधान प्रदान करता है।

NSOperationQueue जीसीडी के शीर्ष पर बनाया गया है, इसलिए यह एक उच्च स्तर का अमूर्त होना चाहिए।

हालांकि, सामान्य मामले में जीसीडी का उपयोग करना इतना आसान है, मुझे लगता है कि यह कई मामलों में NSOperationQueue के लिए बेहतर है।

अब, जब आप मिश्रण में कोरडाटा लाते हैं, तो मैं एक तीसरा विकल्प सुझाता हूं। यदि आप आईओएस 5 का उपयोग कर रहे हैं, तो आप अपने एमओसी के साथ निजी कतार समेकन का उपयोग कर सकते हैं। मुझे लगता है कि यह एक अच्छा अमूर्त है, और उपयोग करने में आसान इंटरफ़ेस प्रदान करता है।

तो, मैं सुझाव दूंगा कि आप प्रत्येक थ्रेड के लिए NSPrivateQueueConcurrencyType के साथ बस एक एमओसी बनाएं जिसमें आप कोर डेटा करना चाहते हैं। आप persistentStoreCoordinator साझा करने के लिए, या एक अलग का उपयोग करने के लिए, अपने आवेदन विशेषताओं के आधार पर चुन सकते हैं। आप नेस्टेड संदर्भों का भी उपयोग कर सकते हैं (डालने के लिए एक चेतावनी के साथ)।

असल में, यह इस मॉडल ...

NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType]; 
moc.parentContext = contextIWantToBeParent; 
moc.persistentStoreCoordinator = pscIWant; 

[moc performBlock:^{ 
    // Your MOC stuff running on its own private queue 
}]; 
बेशक

इस प्रकार है, आप एक विधि (या तो एक मौजूदा एमओसी के लिए parenting या एक PSC के लिए संलग्न) का चयन करना होगा।

मैं आमतौर पर performBlock विधि पसंद करता हूं।

संपादित

धन्यवाद। मैंने पढ़ा है कि NSManagedObject थ्रेड सुरक्षित नहीं है। मैं उस निजी कतार पर नया NSManagedObjects कैसे बनाऊं? - हीलियम 3

हाँ, यह सच है। हालांकि, जब आप एक समवर्ती प्रकार के साथ एक एमओसी बनाते हैं, तो आप इस तरह के अनुबंध से सहमत होते हैं।

मैं

, एक चतुर प्रोग्रामर, सत्यनिष्ठा से संगामिति के बारे में निम्नलिखित कोर डाटा नियमों से सहमत है:

  1. अगर मैं NSConfinementConcurrencyType उपयोग करते हैं, मैं केवल इसका इस्तेमाल होगा, जबकि धागा है कि यह बनाया पर चल रहा है।

  2. यदि मैं NSPrivateQueueConcurrencyType का उपयोग करता हूं, तो मैं केवल performBlock या performBlockAndWait के भीतर से एमओसी का उपयोग करूंगा।

  3. अगर मैं NSMainQueueConcurrencyType उपयोग करते हैं, मैं केवल एमओसी से या तो performBlock, performBlockAndWait भीतर का उपयोग करेगा, या जब मुझे पता है कि मैं मुख्य थ्रेड पर चल रहा हूँ।

यदि आप उन नियमों का पालन करते हैं, तो आप अन्य धागे पर एमओसी का उपयोग करने में सक्षम होंगे।

विशेष रूप से, performBlock का उपयोग करते समय, कोर डेटा एपीआई सुनिश्चित करेगा कि कोड उचित रूप से सिंक्रनाइज़ किया गया है।

+0

धन्यवाद। मैंने पढ़ा है कि NSManagedObject थ्रेड सुरक्षित नहीं है। मैं उस निजी कतार पर नए एनएसएएनएजेड ऑब्जेक्ट्स कैसे बनाऊं? – jarryd

+0

संपादन के लिए धन्यवाद। तो अगर एनएसएनएनेज ऑब्जेक्ट्स को स्टोर में जोड़ा जाता है या एमओसी द्वारा समेकन के साथ संपादित किया जाता है, तो दुकान को मैन्युअल रूप से सिंक करने की कोई आवश्यकता नहीं है? – jarryd

+0

क्षमा करें, मैंने उस प्रश्न का पालन नहीं किया। –