objective c - Delay when updating UILabel in UITableViewCell -


पृष्ठभूमि:

मेरे पास एक कस्टम UITableViewCell उपवर्ग ( एल्बम सेल ), जिसमें दो उप-वर्ग हैं ( Type1AlbumCell और Type2AlbumCell )। AlbumCell केवल एक अमूर्त वर्ग के रूप में कार्य करता है, जबकि बाद के दो को स्टोरीबोर्ड के भीतर एक UITableViewController में प्रोटोटाइप कोशिकाओं के रूप में रखा जाता है। एल्बमकेल दो IBOutlets , जैसेकॉंटलाबेल और shortTitleLabel की घोषणा करता है, जिसमें प्रत्येक उपवर्ग एक प्रोटोटाइप सेल के रूप में अपने लेआउट के माध्यम से दो जोड़ता है स्टोरीबोर्ड।

समस्या:

<कोड> टाइप 2 एल्बम एल्बम में लेबल के लिए पाठ अपडेट करते समय एक विलंब होता है, जबकि प्रकार 1 एल्बम एल्बम मूल्यों को सेट करने के तुरंत बाद अद्यतन करता है यह मुख्य थ्रेड का निष्पादन नहीं हो रहा है , क्योंकि आप पाठ को अद्यतन करने के लिए प्रतीक्षा कर रहे हैं, जबकि आप अन्य कार्यों को स्क्रॉल और निष्पादित कर सकते हैं। यह सिर्फ 4-5 सेकंड या तो लेता है क्या किसी ने पहले ऐसा कुछ अनुभव किया है? धन्यवाद।

कृपया ध्यान रखें, टेक्स्ट को सेल उप-कक्षाओं में से सेट किया जा रहा है, तालिका दृश्य नियंत्रक के भीतर से नहीं। यह समस्या तब होती है जब हम एक सेल वर्तमान में देखे जा रहे लेबल लेबल को अपडेट करने की कोशिश कर रहे हैं, न कि जब cellForRowAtIndexPath में एक नया सेल सेट करते हैं एक बटन सेल उप-कक्षा में टैप किया जाता है जो पाठ को बदलने के लिए कारण होता है।

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

सौभाग्य से, मैं अभी भी पूर्णतया ब्लॉक से यूआईकिट को कॉल कर सकता हूं, जब तक कि मुझे यकीन हो कि कोड मुख्य थ्रेड पर चल रहा है। मैं इसे एक और स्टैक अतिप्रवाह प्रश्न में पाया निम्न कोड का उपयोग कर:

  - (शून्य) runBlockOnMainQueueWithoutDeadlocking: (शून्य (^) (शून्य)) ब्लॉक {if ([NSThread isMainThread]) { ब्लॉक (); } अन्य {dispatch_sync (प्रेषण_पत_मैन_क्लू (), ब्लॉक); }}  

यदि आप पहले से ही मुख्य थ्रेड पर चल रहे हैं, तो यह विधि आपको मुख्य धागा पर बिना किसी मुख्य थ्रेड पर निष्पादित किए जाने वाले कोड के ब्लॉक को पास करने की अनुमति देता है। यह ज्यादातर समय में काम करता है, लेकिन जाहिरा तौर पर कुछ बढ़त वाले मामले हैं।

आप performSelectorOnMainThread:

का भी उपयोग कर सकते हैं

Comments