2012-12-11 14 views
6

मुझे एक अजीब समस्या का सामना करना पड़ रहा है जहां एक एनएसएफआरसी लाया गया ऑब्जेक्ट्स सरणी को सभी ऑब्जेक्ट्स को वापस नहीं लौटा रहा है। आपको कुछ संदर्भ देने के लिए, मेरे आवेदन में कई सूची दृश्य नियंत्रक हैं, जिनमें से प्रत्येक में एनएसएफआरसी है। मैं प्रतिनिधि विधि नियंत्रक DidChangeContent के भीतर सूची दृश्य अद्यतन कर रहा हूँ। जिस समस्या का सामना कर रहा हूं वह निम्न है: पृष्ठभूमि एमओसी में किसी ऑब्जेक्ट को संग्रहीत करने और इसे सहेजने के बाद, नियंत्रकडिड चेंजेंटेंट को आवेदित किया जाता है लेकिन पृष्ठभूमि थ्रेड में सहेजा गया ऑब्जेक्ट एनएसएफआरसी में दिखाई नहीं देता है। यहाँ है कि मैं इस जांच करने के लिए उपयोग कर रहा हूँ कोड का एक टुकड़ा है:NSFetchedResultsController कुछ ऑब्जेक्ट्स गायब हैं

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    NSManagedObjectContext *context = controller.managedObjectContext; 
    NSError *error = nil; 
    NSArray *array = [context executeFetchRequest:controller.fetchRequest error:&error]; 
    if (nil != array) { 
     NSUInteger count = MIN(controller.fetchedObjects.count, array.count); 
     for (NSUInteger index=0; index<count; index++) { 
      NSManagedObject *a = array[index]; 
      NSManagedObject *b = controller.fetchedObjects[index]; 
      // Here you will see that sometimes the objects don't match 
      NSLog(@"%d: %@ <--> %@", index, [[a body] text], [[b body] text]); 
     } 
    } 
} 

मैं NSFRC fetchedObjects सरणी की उम्मीद कर रहा हूँ सरणी एक मैनुअल executeFetchRequest द्वारा वापस करने के लिए समान होना (मैं NSFRC fetchRequest लिए उपयोग कर रहा हूँ डेटा मैन्युअल रूप से प्राप्त करें)। बहरहाल, मामला यह नहीं। मैन्युअल executeFetchRequest NSFRC fetchedObjects की तुलना में अधिक ऑब्जेक्ट देता है। क्या किसी को पता है कि क्या हो रहा है? मैंने एनएसएफआरसी बंद पर कैशिंग चालू कर दी है लेकिन वही व्यवहार की सूचना दी गई है।

धन्यवाद!

=== अद्यतन ====

कि इस मुद्दे पर कुछ अद्यतन। मुझे लगता है कि कोर डेटा में एक बग है क्योंकि मैं एनएसएफआरसी से कुछ असंगत परिणाम देख पा रहा था और इसके अलावा समस्या में ऑब्जेक्ट को "छूने" से जुड़े कामकाज से समस्या को ठीक करने में सक्षम था। यहां एक परिदृश्य है जो बताता है कि क्या हो रहा है:

निम्न कोर डेटा मॉडल की कल्पना करें जहां: - बिल्ली वस्तुएं और मास्टर ऑब्जेक्ट्स हैं। - एक बिल्ली में एक या अधिक मास्टर हो सकते हैं। - एक मास्टर के पास एक या अधिक बिल्ली हो सकती है। - पहला एनएसएफआरसी (चलो इसे एनएसएफआरसी_ए कहते हैं) सभी बिल्लियों को "मास्टर_ए" नामक मास्टर के साथ लाने के लिए बनाया गया है। भविष्यवाणी {ANY master.name == "Master_A"} है। - एक दूसरा एनएसएफआरसी (चलिए इसे एनएसएफआरसीबी कहते हैं) सभी बिल्लियों को "मास्टरबी" नामक मास्टर के साथ लाने के लिए बनाया गया है। भविष्यवाणी {ANY master.name == "Master_B"} है। - यूआई थ्रेड में केवल में उपयोग किया जाने वाला एक मुख्य प्रबंधित ऑब्जेक्ट संदर्भ है - एक सामान्य प्रबंधित ऑब्जेक्ट संदर्भ के रूप में एक ही निरंतर स्टोर का उपयोग करके, प्रत्येक पृष्ठभूमि थ्रेड के लिए बनाई गई पृष्ठभूमि प्रबंधित ऑब्जेक्ट संदर्भ है।

पृष्ठभूमि में "Cat_A" नाम की एक बिल्ली बनाई गई है और "मास्टर_ए" मास्टर को सौंपा गया है। पृष्ठभूमि संदर्भ सहेजे जाने के बाद, मुख्य संदर्भ उचित रूप से अद्यतन किया जाता है। इस बिंदु पर, एनएसएफआरसी_ए अपने प्रतिनिधि को सूचित करता है कि एक परिवर्तन हुआ है और "Cat_A" की सही रिपोर्ट करता है।

बाद में, पृष्ठभूमि धागे में, वही बिल्ली "Cat_A" मास्टर "मास्टर_B" असाइन की जाती है। पृष्ठभूमि संदर्भ सहेजे जाने के बाद, मुख्य संदर्भ उचित रूप से अद्यतन किया जाता है। इस बिंदु पर, एनएसएफआरसी_ए उस परिवर्तन के अपने प्रतिनिधि को सूचित करता है और "Cat_A" की सही रिपोर्ट करता है। एनएसएफआरसीबी भी उस परिवर्तन के अपने प्रतिनिधि को सूचित करता है लेकिन "Cat_A" की रिपोर्ट नहीं करता है (यह अपने fetchedObjects से गायब है)। हालांकि, अगर मैं मैन्युअल रूप से NSFRC_B के समान fetchRequest का उपयोग करके एक fetch निष्पादित करता हूं, तो मैं "Cat_A" वापस लौटा सकता हूं। अजीब चीज यह है कि "Cat_A" उदाहरण लौटाया जा रहा है जिसे एक गलती के रूप में चिह्नित किया गया है जो बताता है कि क्यों NSFRC_B "Cat_A" वापस नहीं करता है क्योंकि यह इसे स्मृति में नहीं देखता है।

यह एक बग है क्योंकि मैं पृष्ठभूमि के थ्रेड से परिवर्तन मुख्य संदर्भ में विलय किए जाने पर मास्टर के लिए "Cat_A" रिश्ते को लॉग इन करके उस व्यवहार को ठीक कर सकता हूं: लॉगिंग मूल रूप से ऑब्जेक्ट को स्पर्श करती है और इसे महसूस करने के लिए मजबूर करती है स्मृति में

+0

गैर-एक्सकोड प्रश्न के लिए +1 एक्सकोड के साथ टैग नहीं किया गया है। :) – Almo

+0

स्वाभाविक रूप से आप पहले से ही दोबारा जांच कर चुके हैं कि किसी ने भी प्रासंगिक अनुरोध पर कोई फ़्रेम सीमा नहीं छीन ली है? – Tommy

+1

आप कैसे जानते हैं कि गणना अलग है। ऊपर तर्क यह बताता है कि मान अलग हैं, लेकिन यह ठीक है, क्योंकि लौटाई गई वस्तुएं एक सरणी हैं और ऑर्डर अलग होगा। एक सरणी में आपको ए, बी, सी, डी मिल सकता है और दूसरे में आपको डी, ए, सी, बी मिल जाएगा। क्या आपने जांच की कि क्या गणना अलग-अलग हैं, क्योंकि आप केवल दोनों के मिनट के माध्यम से लूपिंग कर रहे हैं। – Srikanth

उत्तर

1

समस्या एनएसएफआरसी की सीमा प्रतीत होती है। ऐप्पल फोरम पर इस धागे के अनुसार (https://devforums.apple।कॉम/संदेश/765374): "सीमा यह है कि इकाई ए के लिए एक प्राप्त परिणाम नियंत्रक हमेशा इकाई बी को अद्यतन नहीं पकड़ेगा जो भविष्यवाणी को बदलने का कारण बनता है।" इस मुद्दे को हल करने के लिए, मुझे उस वस्तु को गंदे करना पड़ा जिसे मैं मुख्य थ्रेड में विलय करने से पहले ढूंढ रहा हूं: फिर एनएसएफआरसी उस परिवर्तन का पता लगाता है।