10

मैं इस तरह दो संदर्भ बनाया है:अजीब माता पिता/बच्चे NSManagedObjectContext घटना

// create writer MOC 
_privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[_privateWriterContext setPersistentStoreCoordinator:_persistentStoreCoordinator]; 

// create main thread MOC 
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
_managedObjectContext.parentContext = _privateWriterContext; 

मैं एक NSFetchResultedController_managedObjectContext के साथ शुरू की है।

मुझे पता है कि यह अजीब है, लेकिन मैं माता-पिता को _privateWriterContext पर रिकॉर्ड जोड़ रहा हूं, मैं saving हूं।

आश्चर्य की बात यह है कि बाल संदर्भ और FRC इस घटना के बारे में अधिसूचित हो जाता है। क्यूं कर? मेरे पास reset-बच्चे नहीं है, या कुछ और नहीं है। मैंने सोचा कि वे स्वतंत्र संस्थाएं हैं जब तक कि बाल संदर्भ सहेजा नहीं जाएगा।

जब एक परिवर्तन एक संदर्भ में किया जाता है, लेकिन बचाया नहीं, यह 'लेकिन इसके लिए वंशज नहीं' पूर्वजों अपने सभी के लिए दिख रहा है:


@pteofil लेख में मैं इस लाइन पाया ।

.. इसे लगातार स्टोर (लगातार स्टोर समन्वयक के माध्यम से) पर धकेल दिया जाता है और स्टोर से जुड़े सभी संदर्भों के लिए दृश्यमान हो जाता है।

+2

इस आलेख के अनुसार http://benedictcohen.co।यूके/ब्लॉग/अभिलेखागार/308, यह सामान्य व्यवहार है। – pteofil

+1

और विभिन्न प्रबंधित संदर्भ सेटअप के प्रदर्शन के बारे में एक और बहुत अच्छा लेख: http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/ – pteofil

+0

मुझे लगता है, क्या आपको लगता है कि यह है किसी भी तरह से बाल संदर्भ में प्रचार करने के लिए परिवर्तनों को रोकने के लिए संभव है? मैंने सोचा था कि परिवर्तन तब तक प्रचारित नहीं होंगे जब तक कि मैं 'NSManagedObjectContextDidSaveNotification' का निरीक्षण नहीं करता और अधिसूचना से परिवर्तन विलय करता हूं यदि मैं एक ही पीएससी कॉन्फ़िगरेशन –

उत्तर

0

ऐसा नहीं होना चाहिए। ParentContext में एक NSManagedObject ('record') जोड़ना, बच्चे को इस ऑब्जेक्ट को स्वचालित रूप से अवगत नहीं करेगा। केवल जब आप बच्चे को कॉन्टेक्स्ट को फ़ेच निष्पादित करते हैं, तो यह parentContext से प्राप्त होगा। यह पता लगाने के लिए कि आपका मामले में चल रहा है, यहाँ कुछ सुझाव हैं:।

  • आंकड़ा बाहर जब लाए जाने (इस fetchedRestultsController द्वारा किया जाता है जब आप इसे सेट अप childContext पर निष्पादित किया जाता है कि अगर लाने की जाँच करें parentContext में प्रबंधित ऑब्जेक्ट जोड़ने से पहले या उसके बाद होता है)।
  • fetchedResultsController के सभी चार प्रतिनिधि कॉलबैक में ब्रेकपॉइंट सेट करें, यह पता लगाने के लिए कि यह किस ऑब्जेक्ट को विधियों को कॉल कर रहा है (और देखें कि यह वह ऑब्जेक्ट है जिसे आपने अभी पैरेंट कॉन्टेक्स्ट में जोड़ा है)।
  • पूरी तरह से सुनिश्चित करें कि आप जानते हैं कि आप कौन से संदर्भ संदेश भेज रहे हैं।

मैं एक एक समान दृष्टिकोण का इस्तेमाल किया है, लेकिन अलग: childContext संदर्भ (एक निजी कतार पर) नए डेटा में पार्स करने के लिए प्रयोग किया जाता है, और जब यह पार्स किया जाता है, chid कॉल बचाने :. यह माता-पिता में परिवर्तनों को सहेज लेगा, जो मेरे मामले में mainQueueContext है। सहेजने के लिए यह कॉल: मुख्य क्यूई कोंटेक्स्ट को सभी नए पार्स किए गए ऑब्जेक्ट्स प्राप्त करने का कारण बनता है, और किसी भी fetchedResultsController का उपयोग करके उस mainQueueContext को फिर नए/बदले/अपडेट/हटाए गए ऑब्जेक्ट्स के लिए इसके प्रतिनिधि विधियों को कॉल किया जाएगा। आप अपने बच्चे/अभिभावक रिश्तों को भी बदलने में कोशिश कर सकते हैं और देख सकते हैं कि यह दस्तावेज़ों में वर्णित है या नहीं, यह जानने के लिए कि क्या हो रहा है।

0

मैं दृढ़ता से माता-पिता के संदर्भ सेटअप से बचने की सलाह देता हूं। हमारी पुस्तक विस्तार से बताती है कि वे अक्सर अजीब व्यवहार क्यों करते हैं: https://www.objc.io/books/core-data/

लघु कहानी: वे जितना स्वतंत्र हो उतना स्वतंत्र नहीं हैं।

यदि आप एक से अधिक संदर्भ की आवश्यकता है तो एक एकल निरंतर स्टोर समन्वयक साझा करने वाले एकाधिक संदर्भ का उपयोग करें।

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