2011-10-11 8 views
5

कोको टच पर, अगर हम एक पृष्ठभूमि धागे से यूआई तत्वों को अपडेट, बुरा सामान होता है।कोको टच/UIKit पर, पृष्ठभूमि थ्रेड से उपयोगकर्ता इंटरफ़ेस में परिवर्तनों का पता लगाने के लिए कैसे?

समस्या है, यह हर समय नहीं होता है, तो कुछ हल्के पृष्ठभूमि यूआई दखल थोड़ी देर के लिए किसी का ध्यान नहीं जा सकता जब तक यह दांतों में अपने अधिकार की शुरूआत की।

वहाँ एक पंडिताऊ मोड में UIKit रन बनाने के लिए इतना है कि जैसे ही किसी को एक पृष्ठभूमि से एक तत्व को अद्यतन करता के रूप में थ्रेड यह दुर्घटनाओं या कंसोल के लिए कुछ लॉग कोई तरीका है?

उत्तर

2

आप अपने आप को जांच कर सकते हैं आप या मुख्य थ्रेड पर सामान कर रहे हैं अपने यूआई अद्यतन करने से पहले नहीं। मैं अपने आप को लिखा है निम्न मैक्रो:

/// Stick this in code you want to assert if run on the main UI thread. 
#define DONT_BLOCK_UI() \ 
    NSAssert(![NSThread isMainThread], @"Don't block the UI thread please!") 

/// Stick this in code you want to assert if run on a background thread. 
#define BLOCK_UI() \ 
    NSAssert([NSThread isMainThread], @"You aren't running in the UI thread!") 

मैं समूह के लिए तरीकों जहां विधि एक कुछ संसाधन करता है और उसके बाद में मेरी कोड जाते विधि बी, जो यूआई अद्यतन करता है कहता है। विधि बी की शुरुआत में मैं BLOCK_UI() मैक्रो चिपकाता हूं, जो दावा करेगा कि यह यूआई पर नहीं चल रहा है या नहीं। साथ ही, लंबे समय तक चलने वाले कार्यों के लिए मैं अन्य मैक्रो का उपयोग करता हूं। मैंने इन मैक्रोज़ और अधिक यादृच्छिक सामान https://github.com/gradha/ELHASO-iOS-snippets पर रखे हैं जिन्हें आप उपयोगी पा सकते हैं।

ये मैक्रो उन्हें प्रयोग, दुर्भाग्य में अनुशासन की आवश्यकता है। ऐसी स्थितियों से निपटने के लिए एक और अधिक दखल तरह से एक प्रॉक्सी (शायद लांच पर swizzling?) जो अगर वे मुख्य थ्रेड में नहीं इस्तेमाल किया गया इस बात पर जोर के माध्यम से सभी एसडीके इंटरफ़ेस वस्तुओं रैप करने के लिए हो सकता है। वास्तविक रिलीज को कम करने से बचने के लिए ये प्रॉक्सी/स्विजलिंग केवल डीबग बिल्ड या सिम्युलेटर पर्यावरण में ही होगी। मैंने ऐसा करने पर विचार किया है ... लेकिन ठीक से करने के लिए दर्द की तरह दिखता है।