2011-10-27 16 views
5

इस पर मेरे बालों को फाड़ते हुए, किसी भी विचार या सुझाव की सराहना की जाएगी।प्रदर्शन चयनकर्ताऑनमेन थ्रेड निष्पादित नहीं करता

मेरे पास एक ऑब्जेक्ट है जो बच्चे के थ्रेड से performSelectorOnMainThread:withObject:waitUntilDone: पर कॉल करता है। यह समय का 9 5% ठीक काम करता है। प्रत्येक बार आईओएस बीटा के बाद और अब रिलीज होने के बाद, एक डिवाइस performSelectorOnMainThread:withObject:waitUntilDone: कॉल निष्पादित करने से इंकार कर देगा ... कोई त्रुटि संदेश नहीं, यह क्रैश नहीं होता है, मैं एक डिवाइस को ऐसे राज्य में नहीं जा सकता जहां यह "विफल हो जाता है "लेकिन एक बार जब यह वहां होता है तब तक यह असफल रहता है जब तक कि मैं या तो ऐप को हटा और पुनः इंस्टॉल नहीं करता, या इसे छोड़ने के लिए मजबूर करता हूं, फिर उसे स्थान सेवा भत्ता समायोजित करता हूं, फिर इसे लॉन्च करता है, फिर इसे फिर से सामान्य स्थान पर फिर से स्थानांतरित कर देता है। .. डिवाइस को पुनरारंभ करने से यह ठीक नहीं होता है। पहले हटाने के बिना पुनः स्थापित करना इसे ठीक नहीं करता है। यह बहुत अजीब है .... मुझे पता है कि यह ज्यादातर समय काम करता है क्योंकि अधिकांश उपकरणों में कोई समस्या नहीं होती है, हालांकि कुछ डिवाइस नियमित रूप से कुछ हद तक असफल होते हैं (हर 3 या 4 दिन शायद)। मुझे पता है कि यह विशेष रूप से है कि performSelectorOnMainThread:withObject:waitUntilDone: यह नहीं कह रहा है कि मुझे क्या करना चाहिए क्योंकि मुझे अब एक असफल डिवाइस मिल गया है, और मैंने एनएसएलओजी को उस विधि में रखा है जिसे कॉल किया जाना चाहिए। यह ठीक काम करता है, लेकिन असफल डिवाइस पर, जब performSelectorOnMainThread:withObject:waitUntilDone: का उपयोग उस विधि को कॉल करने के लिए किया जाता है, तो एनएसएलओजी दिखाता है कि यह नहीं चल रहा है ...

यह आईओएस 5 बीटा के साथ हो रहा है और फिर, रिलीज पर होता है। यह अक्सर मेरे 2 डिवाइसों पर होता है, लेकिन अन्य 10 उपकरणों में से कोई भी मैंने व्यक्तिगत रूप से परीक्षण नहीं किया है। मुझे लगता है कि यह बीटा में कुछ हिचकी से मेरा डिवाइस था, लेकिन यह मेरे ब्रांड के नए 4 एस पर होता है जो बीटा को कभी नहीं छुआ, साथ ही साथ एक उपयोगकर्ता के आईपैड 2 (मेरे आईपैड 2 पर नहीं) पर भी।

मुझे वास्तव में नहीं पता कि कहां देखना है। मैं इसे निष्पादित करने के लिए कहता हूं और यह आमतौर पर लगभग हर डिवाइस पर करता है, लेकिन उसी पंक्ति को कुछ प्रतिक्रिया नहीं होती है और कुछ त्रुटियों आदि नहीं होती है ...

+0

हैं आप किसी भी मौके से CoreData का उपयोग कर रहे हैं? मेरा मुद्दा भी ऐसा ही था। वास्तव में क्या हो रहा था थ्रेड डेडलॉक कोरडाटा का उपयोग करके एक पठन ऑपरेशन करने की प्रतीक्षा कर रहा था जबकि दूसरा धागा लिखने की कोशिश कर रहा था। – picciano

+0

@picciano आप इस के आसपास कैसे पहुंचे? मुझे एक ही समस्या का सामना करना पड़ रहा है और यह पता नहीं लगा सकता कि मुझे डेडलॉक को ठीक करने के लिए क्या करना है। –

उत्तर

3

प्रदर्शन चयनकर्ताऑनमेन थ्रेड: ऑब्जेक्ट: प्रतीक्षा करें कभी भी कभी-कभी जीत नहीं सकता है। क्या आपने lib प्रेषण का उपयोग करने की कोशिश करने के बारे में सोचा है?

आप एक ब्लॉक बना सकते हैं और इस तरह से मुख्य थ्रेड पर पोस्ट:

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

यह वही सहेजें को प्रभावित होता है के रूप में performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

एक थ्रेड RunLoop है कई अलग प्रकार का उपयोग कर। यह उस समय के दौरान आप अपने कॉल मुख्य थ्रेड एक मोड डिफ़ॉल्ट एक (जो एक performSelectorOnMainThread:withObject:WaitUntilDone: द्वारा लक्षित है की तुलना में अलग में चल रहा है संभव है।

का उपयोग कर performSelectorOnMainThread:withObject:waitUntilDone:modes:
Apple's documentation देखें पर विचार करें।

इसके अलावा - GCD (libdispatch) भयानक है, लेकिन यह अपने आप खाना पकाने के एक गतिरोध से बचाने नहीं होगा: इस मामले में जहां अपने विधि मुख्य थ्रेड पर चल रहा है पर विचार करें और आप कॉल कर रहे:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 
संबंधित मुद्दे