2012-08-08 9 views
6

childContext और parentContext "NSMainQueueConcurrencyType" के दोनों कर रहे हैंनेस्टेड NSManagedObjectContext बचाने के लिए और objectId

[childContext performBlock:^(void) { 
    [childContext save:NULL]; 

    [parentContext performBlock:^(void) { 
    [parentContext save:NULL]; 
    // Why is objectID for the inserted NSManagedObject still a temporary one here? 
    }]; 
}]; 

प्रश्न:

  1. इस सही तरीके से दोनों बच्चे और माता पिता के संदर्भ को बचाने के लिए
  2. क्यों है है यह कि सहेजने के बाद, सम्मिलित NSManagedObject की ऑब्जेक्ट आईडी अभी भी एक अस्थायी है?

उत्तर

3

मैं कुछ दुर्लभ अवसरों के बारे में सोच सकता हूं जहां आप एक मुख्य मुख्य कतार एमओसी के बच्चे के रूप में मुख्य कतार एमओसी रखना चाहते हैं, लेकिन यह सुनिश्चित करना कि मुझे दोनों से पूछने का क्या फायदा है: दोनों का लाभ क्या है उनमें से NSMainQueueConcurrencyType हो?

इसके अलावा, यह एक ज्ञात बग है (कम से कम इसे कई बार रिपोर्ट किया गया है)। जब आप किसी बच्चे के संदर्भ से सम्मिलित करते हैं और सहेजते हैं, तो केवल लगातार स्टोर से जुड़ा हुआ व्यक्ति ही आईडी को उत्परिवर्तित करता है। इसलिए, नए डाले गए आइटमों को सहेजते समय, आपके पास कई विकल्प हैं।

  1. सहेजने से पहले लगातार आईडी प्राप्त करें।
  2. [moc refreshObject:object mergeChanges:NO] पर कॉल करें और सभी संदर्भों को शून्य पर सेट करें। सबसे माता पिता के बाद
  3. मोल लगातार आईडी बचाता

मैं # 3 पसंद करते हैं क्योंकि यह डेटाबेस में एक डुबकी की आवश्यकता है। यदि आप इसे बाद में करते हैं, तो यह उन्हें माता-पिता से प्राप्त कर सकता है।

+1

आपके उत्तर में प्रश्न का उत्तर देने के लिए: बदलावों की एक श्रृंखला के लिए एक बच्चे को "स्टेजिंग क्षेत्र" के रूप में बनाना, जिससे उन्हें बचाया जा सके या परमाणु रूप से खारिज कर दिया जा सके। (दूसरे शब्दों में, यदि उपयोगकर्ता रद्द करें बटन टैप करता है, तो आप इसे सहेजने के बिना एमओसी को छोड़ दें।) – benzado

संबंधित मुद्दे