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
हाँ, यह सच है। हालांकि, जब आप एक समवर्ती प्रकार के साथ एक एमओसी बनाते हैं, तो आप इस तरह के अनुबंध से सहमत होते हैं।
मैं
, एक चतुर प्रोग्रामर, सत्यनिष्ठा से संगामिति के बारे में निम्नलिखित कोर डाटा नियमों से सहमत है:
अगर मैं NSConfinementConcurrencyType
उपयोग करते हैं, मैं केवल इसका इस्तेमाल होगा, जबकि धागा है कि यह बनाया पर चल रहा है।
यदि मैं NSPrivateQueueConcurrencyType
का उपयोग करता हूं, तो मैं केवल performBlock
या performBlockAndWait
के भीतर से एमओसी का उपयोग करूंगा।
अगर मैं NSMainQueueConcurrencyType
उपयोग करते हैं, मैं केवल एमओसी से या तो performBlock
, performBlockAndWait
भीतर का उपयोग करेगा, या जब मुझे पता है कि मैं मुख्य थ्रेड पर चल रहा हूँ।
यदि आप उन नियमों का पालन करते हैं, तो आप अन्य धागे पर एमओसी का उपयोग करने में सक्षम होंगे।
विशेष रूप से, performBlock
का उपयोग करते समय, कोर डेटा एपीआई सुनिश्चित करेगा कि कोड उचित रूप से सिंक्रनाइज़ किया गया है।
धन्यवाद। मैंने पढ़ा है कि NSManagedObject थ्रेड सुरक्षित नहीं है। मैं उस निजी कतार पर नए एनएसएएनएजेड ऑब्जेक्ट्स कैसे बनाऊं? – jarryd
संपादन के लिए धन्यवाद। तो अगर एनएसएनएनेज ऑब्जेक्ट्स को स्टोर में जोड़ा जाता है या एमओसी द्वारा समेकन के साथ संपादित किया जाता है, तो दुकान को मैन्युअल रूप से सिंक करने की कोई आवश्यकता नहीं है? – jarryd
क्षमा करें, मैंने उस प्रश्न का पालन नहीं किया। –