2010-10-13 11 views
25

से विलय कर दिया मैं NSFetchedResultsController जो एक विधेय है का उपयोग कर तालिका दृश्य सामग्री पेश कर रहा हूँ पर ध्यान नहीं देता NO से YES। सहेजें, मुख्य थ्रेड के NSManagedObjectContext में परिवर्तन मर्ज करें। लेकिन NSFetchedResultsController का fetchedObjects नहीं बदलता है। नियंत्रक भी नियंत्रक पर -controller:didChangeObject:... पर कॉल नहीं करता है। यदि इकाइयों को मुख्य धागे पर समान तरीके से अपडेट किया जाता है (मेरा टेस्ट ऐप एक ही विधि को कॉल करता है), सबकुछ अपेक्षित काम करता है।NSFetchedResultsController परिवर्तन अलग NSManagedObjectContext

भी अधिसूचना NSUpdatedObjectsKey उन वस्तुओं को शामिल करता है।

वर्तमान में केवल समाधान मैंने पाया NSUpdatedObjectsKey संस्थाओं से प्रत्येक के लिए कॉल करने के लिए है:

NSManagedObjectContext *context = ... // main thread context 
[context existingObjectWithID:[object objectID] error:nil] 

यह समस्या केवल साथ वस्तुओं अद्यतन जो पहले विधेय से मेल नहीं खाती है।

क्या मुझे कुछ याद आ रही है?

+0

क्या यह कोर डेटा का एक बग नहीं है? मुझे लगता है कि हमें ऐप्पल को बग रिपोर्ट आग लगनी चाहिए। मैंने अभी एक किया है। – an0

+0

बग? यदि ऐसा कोई प्रगति है? – lostintranslation

+0

यह बग अंततः आईओएस 10 में तय किया गया है: https://twitter.com/an0/status/750413478620491776 – an0

उत्तर

53

अपडेट किए गए ऑब्जेक्ट्स के लिए मुख्य NSManagedObjectContext ईवेंट इवेंट आग NSManagedObjectContextObjectsDidChangeNotification नहीं करता है क्योंकि यह दोषपूर्ण ऑब्जेक्ट्स के लिए नहीं किया जाता है।

जेनेरिक ठीक (या वस्तु आईडी की एक ट्रैक है कि इस इलाज की जरूरत है रखने के लिए):

NSManagedObjectContext *context = [self managedObjectContext]; 
for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) { 
    [[context objectWithID:[object objectID]] willAccessValueForKey:nil]; 
} 

[context mergeChangesFromContextDidSaveNotification:notification]; 

से NSManagedObject Class Reference:

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

+0

इससे मुझे इतना समय बचाया गया। मैं इसे पर्याप्त रूप से ऊपर नहीं उठा सकता। धन्यवाद। –

+0

वाह मेरे लिए भी यही है। इस पर घंटों बर्बाद कर रहे थे! – samvermette

+0

'NSFetchRequest' पर अलग-अलग सेटिंग्स के साथ ऐसा करने का कोई तरीका नहीं होना चाहिए? मैंने 'रिलेशनशिपफ्रेटिंग' और - [NSFetchRequest setReturnsObjectAsFaults: NO] 'निर्दिष्ट करने का प्रयास किया, लेकिन न तो काम किया। –

2

आप अपने पृष्ठभूमि-NSManagedObjectContext पर processPendingChanges कॉल करने के लिए आप एक अन्य NSManagedObjectContext से परिवर्तन विलय कर के बाद की है।

देखें CoreData प्रोग्रामिंग गाइड:

ध्यान दें कि परिवर्तन सूचना NSManagedObjectContext के processPendingChanges विधि में भेजा जाता है। मुख्य धागा को अनुप्रयोग के लिए चक्र में सम्मिलित किया गया है ताकि प्रक्रिया PendingChanges को को मुख्य थ्रेड के स्वामित्व वाले संदर्भों पर प्रत्येक उपयोगकर्ता ईवेंट के बाद स्वचालित रूप से लागू किया गया हो। पृष्ठभूमि पृष्ठभूमि के लिए यह मामला नहीं है- जब विधि लागू होती है तो प्लेटफॉर्म और रिलीज़ संस्करण दोनों पर निर्भर करता है, इसलिए आप को विशेष समय पर भरोसा नहीं करना चाहिए। यदि माध्यमिक संदर्भ मुख्य थ्रेड पर नहीं है, तो आपको प्रक्रिया को कॉल करना चाहिए उचित जंक्शन पर स्वयं को बदलें।

+0

क्या आप वाकई इस मुद्दे को ठीक करेंगे? मुझे नहीं लगता कि NSFetchedResults नियंत्रक * पृष्ठभूमि * संदर्भ से परिवर्तन अधिसूचनाओं के लिए सुन रहा है। –

+0

'mergeChangesFromContextDidSaveNotification:' प्रक्रिया (लगभग) प्रक्रिया को 'processPendingChanges' के रूप में करता है, और उपयुक्त अधिसूचना पोस्ट करता है। – quellish