2012-09-04 23 views
10

मैंने कुछ वीडियो/धागे देखे हैं जो कहते हैं कि 'बच्चों' एमओसी बनाने के लिए संभव है - एमओसी जो अन्य एमओसी का उपयोग अपने लगातार स्टोर के रूप में करते हैं। उपयोगी, उदाहरण के लिए, एक संदर्भ में जहां आप अपने आवेदन को थ्रेड कर रहे हैं, और एक मास्टर एमओसी रखना चाहते हैं जो कि बाल धागे के परिवर्तनों को सहेज/रोलबैक कर सकता है। (जो मैं समझता हूं, उससे एक एमओसी और उसके प्रबंधित ऑब्जेक्ट्स का उपयोग सभी धागे पर किया जाना चाहिए)मैं एक बच्चे NSManagedObjectContext कैसे बना सकता हूं?

सवाल यह है कि, मैं एक बच्चे एमओसी कैसे बना सकता हूं? मैं उन डब्ल्यूडब्ल्यूडीसी वीडियो को ट्रैक नहीं कर सकता जो मैं देख रहा था, जिसने उन्हें पेश किया था, और जो कुछ भी मैंने देखा है, उनके बारे में बात करने के बारे में बात कर रही है। वे आसानी से एक नया एमओसी आवंटित कर सकते हैं, लेकिन मैं इसे कैसे सेट करूं लगातार दुकान एक और एमओसी होने के लिए संदर्भ किसी भी कार्य करता है कि कि प्रदर्शित नहीं करता है

उत्तर

32

एक नया एमओसी जिसके लिए आप तुल्यकालन के पूर्ण नियंत्रण है बनाएँ। यह init और पूर्व-अभिभावक/बाल संबंधों के समान व्यवहार के समान है।

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] 
     initWithConcurrencyType:NSConfinementConcurrencyType]; 

आप माता-पिता अपनी संपत्ति की स्थापना करके एक और एमओसी के लिए एक एमओसी:

moc.parentContext = someOtherMocThatIsNowMyParent; 

यहाँ, बच्चे माता-पिता के लिए चुनता है। मुझे यकीन है कि मेरे बच्चे चाहते हैं कि वे NSManagedObjectContexts थे। एक मूल संदर्भ NSPrivateQueueConcurrencyType या NSMainQueueConcurrencyType का होना चाहिए।

आप एक एमओसी वह यह है कि एक निजी कतार में "बाध्य" बना सकते हैं:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] 
     initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

आप केवल performBlock या performBlockAndWait एपीआई के माध्यम से इसे उपयोग करना चाहिए जिसका मतलब है। आप उन विधियों को किसी भी धागे से कॉल कर सकते हैं क्योंकि वे ब्लॉक में कोड के उचित क्रमबद्धता सुनिश्चित करेंगे। उदाहरण के लिए ...

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] 
     initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
moc.parentContext = someOtherMocThatIsNowMyParent; 
[moc performBlock:^{ 
    // All code running in this block will be automatically serialized 
    // with respect to all other performBlock or performBlockAndWait 
    // calls for this same MOC. 
    // Access "moc" to your heart's content inside these blocks of code. 
}]; 

performBlock और performBlockAndWait के बीच अंतर यह है कि performBlock कोड का एक खंड का निर्माण करेगा, और ग्रांड सेंट्रल डिस्पैच के साथ शेड्यूल किसी अज्ञात धागे पर, भविष्य में कभी न कभी एसिंक्रोनस रूप से निष्पादित किया जाना है । विधि कॉल तुरंत वापस आ जाएगी।

performBlockAndWait अन्य सभी performBlock कॉल के साथ कुछ जादू सिंक्रनाइज़ेशन करेगा, और जब इस से पहले प्रस्तुत किए गए सभी ब्लॉक किए जाते हैं, तो यह ब्लॉक निष्पादित होगा। इस कॉल को पूरा होने तक कॉलिंग थ्रेड पेंड करेगा।

आप एक एमओसी भी बना सकते हैं जो मुख्य थ्रेड के लिए "बाध्य" है, जैसे निजी सहमति।

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] 
     initWithConcurrencyType:NSMainQueueConcurrencyType]; 
moc.parentContext = someOtherMocThatIsNowMyParent; 
[moc performBlock:^{ 
    // All code running in this block will be automatically serialized 
    // with respect to all other performBlock or performBlockAndWait 
    // calls for this same MOC. Furthermore, it will be serialized with 
    // respect to the main thread as well, so this code will run in the 
    // main thread -- which is important if you want to do UI work or other 
    // stuff that requires the main thread. 
}]; 

आप केवल यह सीधे का उपयोग करना चाहिए यदि आप जानते हैं कि आप मुख्य थ्रेड, याperformBlock या performBlockAndWait एपीआई के माध्यम से कर रहे हैं, जिसका मतलब है।

अब, आप "मुख्य संगामिति" एमओसी या तो उपयोग कर सकते हैं performBlock विधियों के माध्यम से, या सीधे यदि आप जानते हैं आप पहले से ही मुख्य थ्रेड में चल रहे हैं।

+0

ऐसे (अविश्वसनीय) पूर्ण उत्तर के लिए धन्यवाद। – RonLugge

+0

हैलो, मुझे पता है कि यह वास्तव में पुराना है, लेकिन मेरा सवाल एक नया निर्माण करने के लिए काफी बड़ा नहीं है, मैं सोच रहा था कि मुझे प्रदर्शनबैक या बाहर के अंदर संदर्भ पर कहां से कॉल करना चाहिए? धन्यवाद ! – ItsASecret

+0

प्रदर्शन के अंदर –

1

बच्चे एमओसी तो प्रारंभ:?!

[_childMOC performBlockAndWait:^{ 
      [_childMOC setParentContext:parentMOC]; 
}]; 
+0

तो ...मैं धागे के पार एमओसी एक्सेस कर सकता हूं, मुझे बस उनको भरने (डालने, हटाने, सहेजने, रोलबैक) करने की अनुमति नहीं है? – RonLugge

+1

आप अन्य थ्रेड से प्रदर्शनब्लॉक और प्रदर्शनब्लॉक एंडवेट को कॉल कर सकते हैं। और कुछ नहीं –