objective c - KVO: UITableViewCell observing model property - how to unregister when model deallocs? -


मेरे पास UITableViewCell s है जिसमें एक imageView लोड होता है < कोड> UIImage एक मॉडल ऑब्जेक्ट से myObject UIImage पर संपत्ति myObject को असिंक्रोनस रूप से लोड किया जाता है और मैं इसे tableViewCell से परिवर्तनों को देखता हूं जब मैं इसे पुनः लोड कर सकता हूं (और प्लेसहोल्डर को बदल सकता है) छवि)। यहाँ मेरी समस्या secenario है:

  1. उपयोगकर्ता एक खोज करता है, जो मॉडल ऑब्जेक्ट की एक सरणी को प्रदर्शित करता है
  2. उन मॉडल ऑब्जेक्ट को UITableViewCell s में दर्शाया जाता है , और async download completion के लिए iconImg संपत्ति मनाई गई है। (यह बहुत अच्छा काम करता है, अब तक)।
  3. यदि उपयोगकर्ता कोई अन्य खोज करता है, तो मैं उन मूल मॉडल ऑब्जेक्ट को त्याग देता हूं, और इसके परिणामस्वरूप "क्लास मर्चेंट का एक उदाहरण हटा दिया गया था जबकि कुंजी मान पर्यवेक्षक अभी भी पंजीकृत थे इसके साथ "संदेश, जो अच्छा नहीं बोलता है।

    मेरे कोड के लिए dealloc पद्धतियां से सेल को अनियंत्रित करता है, लेकिन वह जब मैं dealloc ऊपर स्थित परिदृश्य में अंतर्निहित मॉडल को नहीं कहा जाता है जब मेरे पास देखा गया उदाहरण dealloc s है तो मेरे सेल को अपंजीकृत करने का कोई स्पष्ट तरीका है? क्या मैं मॉडल ऑब्जेक्ट के dealloc में सभी पर्यवेक्षकों को अभी हटा सकता हूं? प्रश्न: क्यों केवीओ स्वचालित रूप से ऑब्जेक्ट से पंजीकृत पर्यवेक्षकों को नहीं हटाते हैं जब यह dealloc एस?

    अद्यतन: इसे ठीक करने का सबसे अच्छा तरीका के लिए मेरी टिप्पणी देखें उसने कहा, यह समझने के लिए कि क्या हो रहा है, यह प्रश्न अभी भी जानकारीपूर्ण है ... (अंत अपडेट)

    हल (कम से कम मेरे मामले में)। यहाँ क्या हो रहा है:

    मेरा दृश्य नियंत्रक खोज परिणामों को प्रदर्शित करने के लिए उपयोग किया जाता है, और यह उन खोज परिणामों को मॉडल ऑब्जेक्ट की एक सरणी के रूप में संग्रहीत करता है मैं प्रत्येक खोज परिणाम को प्रदर्शित करने के लिए एक कस्टम UITableViewCell उप-कक्षा का उपयोग करता हूं, और इसे कॉन्फ़िगर करने के भाग के रूप में, मैं कस्टम सेल की संपत्ति के भीतर संबद्ध मॉडल ऑब्जेक्ट (खोज परिणाम) को संग्रहीत करता हूं, इसे myCell.modelObject पर कॉल करें।

    जैसा कि मैंने नोट किया है, त्रुटि हर खोज पर हो रही है को छोड़कर प्रारंभिक डीबग करने के लिए, मैंने NSKVODeallocateBreak पर एक प्रतीकात्मक ब्रेकपैकेज सेट किया और देखा कि यह मेरे किसी कस्टम कक्ष में से एक का उपयोग कर रहा है :

      - (शून्य) कॉन्फ़िगरविथमोलोडऑब्जेक्ट: (मॉडलऑबैक्ट *) aModelObject {// @property (nonatomic, retain) ModelObject * modelObject; Self.modelObject = aModelObject; // & lt; - NSKVodeallocateBreak यहाँ रोका गया ....}   

    तो, मेरा दृश्य नियंत्रक, दूसरा खोज परिणाम सेट प्राप्त करने पर, मूल खोज के मॉडल ऑब्जेक्ट युक्त ऐरे को रिलीज़ करेगा। मेरे फिर से उपयोग करने योग्य कस्टम कक्ष के उदाहरणों को अभी भी बनाए रखा जाएगा, कम से कम जब तक उन कोशिकाओं को पुन: प्रयोग नहीं किया जाता। उस समय, जब self.modelObject को अपडेट किया जाता है, तो पिछले मॉडल ऑब्जेक्ट को फिर से रिलीज किया जाता है और अंत में को डीलोकेट कर दिया जाता है, लेकिन क्योंकि यह सेल जो देख रहा था उसे रद्द नहीं किया गया था, लेकिन इसके बजाय उसका पुन: उपयोग किया गया था, मेरी [मॉडल ऑब्जेक्ट निकालनाऑब्सर्वर ...] [MyCell dealloc] में कॉल नहीं किया गया था।

    समाधान: मेरे कस्टम सेल को कॉन्फ़िगर करने पर, मुझे यह जांचना होगा कि मॉडल ऑब्जेक्ट पहले से सेट है, जो कि एक संकेत है कि यह सेल फिर से इस्तेमाल किया जा रहा है यदि ऐसा है, तो मैं संपत्ति को अपडेट करने से पहले मूल मॉडल ऑब्जेक्ट को रोकना बंद कर देता हूं:

      - (शून्य) कॉन्फ़िगर करेंविथममोबाइल वस्तु: (मॉडल ऑब्जेक्ट *) aModelObject {if (modelObject! = Nil) {// I फिर से इस्तेमाल किया! पुरानी मॉडल ऑब्जेक्ट को देखना बंद करो! [मॉडल ऑब्जेक्ट निकालनाऑब्सेंवर: स्वयं केकेपाथ के लिए: @ "कीपैथ आईओएसओस्किंग"]; } Self.modelObject = aModelObject; // & lt; - NSKVodeallocateBreak यहां रोक दिया गया ....   

    ध्यान दें : मुझे अभी भी [modelObject removeObserver ...] [cell dealloc] में कॉल करना होगा

    मुझे आशा है कि यह एक समान पैटर्न के साथ दूसरों के लिए उपयोगी है।

    सर्वश्रेष्ठ, स्टीव

Comments