2012-06-06 15 views
6

को ट्रैक करने के लिए युक्तियाँ 2 साल पहले मैंने एक विशाल आईपैड ऐप लिखा था और अब मैं इसे वापस प्राप्त कर रहा हूं और इसे आईओएस 5 में अपग्रेड कर रहा हूं। यह थोड़ा गन्दा है क्योंकि यह मेरा पहला बड़ा आईपैड ऐप था।आईओएस यूआई

यह एक "सिंक" कदम है कि कई मिनट के लिए पिछले मई है और इन अतुल्यकालिक विधि कॉल कि जाने के लिए और एक यूआरएल से JSON को लाने और उन्हें कोर डेटा में डाल का एक समूह है। काफी बार, ऐप स्थिर हो जाएगा (यूआई उत्तरदायी नहीं है)।

इस ठंड को ट्रैक करने के लिए कुछ अच्छी तकनीकें क्या हैं? डीबगर उस सहायक नहीं है जब तक कि मुख्य थ्रेड पर कोड चल रहा न हो, आपके पास कोई उपयोग करने योग्य स्टैक ट्रेस नहीं है। ऐप अक्सर या तो ठीक नहीं होता है जो कुछ प्रकार की मृत ताला स्थिति का सुझाव देता है।

enter image description here

मैं निष्पादन रुका हुआ है एक बार मैं सत्यापित है कि यह जम गया:

यहाँ एक विशिष्ट उदाहरण है कि मदद कर सकता है है। ऐसा लगता है कि हर बार एक ही पंक्ति पर फ्रीज होता है - एक साधारण असाइनमेंट। यहाँ क्या हो रहा है? यह बहुत निराशाजनक है।

क्या यह कोर डेटा एक्सेस है जो इसका कारण बन रही है? किसी भी प्वाइंटर की अत्यधिक सराहना की जाएगी।

संपादित 29 जून 2012

Click here वर्ग है कि सभी बनाएं/अपडेट/कोर डेटा वस्तुओं का हटाया जा रहा करता है के स्रोत को देखने के लिए। मुझे बस इस ऐप में फ्रीजिंग/क्रैशिंग को रोकने की जरूरत है। मुझे इसकी गड़बड़ी पता है, यह मुझे भी क्रिंग करता है। मैंने इस 2 साल पहले लिखा था कि उद्देश्य-सी के किसी भी ज्ञान के साथ। मुझे इसे फिर से लिखना चाहिए, लेकिन मुझे यह काम 2 दिनों में काम करना और मेरे सिर से बाहर करना है। क्या कोई मुझे इस थ्रेड-सुरक्षित को तुरंत प्राप्त करने के लिए दृष्टिकोण पर पॉइंटर्स दे सकता है? क्या मैं प्रत्येक विधि को लपेट सकता हूं जो ग्रैंड सेंट्रल प्रेषण ब्लॉक कोड में NSManagedObjectContext को अद्यतन करता है?

+1

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

+2

एक और विचार (डीबगर में रुकने और सर्वश्रेष्ठ की उम्मीद करने के बजाए) ऐप को इंस्ट्रूमेंट्स के तहत चलाने के लिए हो सकता है, जो आपको बताएगा कि कौन से तरीके सबसे अधिक उपयोग कर रहे हैं। मुझे इन मुद्दों को ठीक से डिबग करने के लिए बहुत उपयोगी पाया गया है। –

+0

मैंने स्रोत से लिंक के साथ प्रश्न अपडेट किया - अगर इससे मदद मिलती है। –

उत्तर

2

यह वास्तव में संभव है कि कोर डेटा (मल्टीथ्रेडिंग के साथ संयोजन में) आपकी परेशानी का कारण है - मुझे इसी तरह की समस्याएं मिलीं। Core Data and threads, without the headache

मैं भी अपने स्टैक ट्रेस में performSelector: के लिए एक कॉल देखें:

यहाँ इस विषय पर एक उत्कृष्ट लेख है। आप ग्रैंड सेंट्रल डिस्पैच का उपयोग करने पर विचार करना चाहेंगे, हालांकि यह आपके मामले में फिर से लिखने के लिए बहुत कुछ हो सकता है।

अपने अपने वास्तविक प्रश्न का सवाल है (गतिरोध पर नज़र रखने के), मैं भी उपकरण का उपयोग कर सुझाव देना चाहेंगे। इसके अलावा, अन्य धागे की स्थिति को देखो।

+0

तो क्या आप भी मुद्दों को ठंडा कर रहे थे? –

+0

हां, मैंने मुद्दों को ठंडा कर दिया था साथ ही साथ सामान्य अजीब व्यवहार (और कुछ दुर्घटनाएं)। कोर थ्रेड को मुख्य थ्रेड पर कम करके इसे हल किया जा सकता है, लेकिन मैंने परीक्षण प्रोजेक्ट में उल्लिखित आलेख में दृष्टिकोण की कोशिश की है, और यह काम करता है (एकाधिक धागे के साथ)। –

0

तुमने कहा था: के रूप में जब तक कोड मुख्य थ्रेड पर चल रहा है, तो आप कोई useable स्टैक ट्रेस है

डिबगर कि उपयोगी नहीं है।

यह सच नहीं है। आपको सभी धागे के लिए स्टैक निशान मिलते हैं।

तथ्य यह है कि यह एक ही लाइन पर बहुत ज्यादा हर बार जमा पता चलता है कुछ है कि लाइन के साथ कुछ गड़बड़ है।

self.friendObj.affiliations = friendObject1.affiliations; 

तो, मुझे लगता है कि लाइन पर एक ब्रेकपाइंट रखा और जब Xcode ब्रेकप्वाइंट पर बंद हो जाता है, friendObj1 की स्मृति का विश्लेषण: यह आप क्या कर रहे है। शायद कुछ मज़ाकिया चल रहा है।

क्या आपके दोस्त ओबज की कक्षा में कोई कस्टम "सेट अपवाद:" विधि है? शायद किसी भी तरह उस लाइन पर एक अनंत लूप हो रहा है।

मैं आपके दोस्त ओबज की "संबद्धताओं" संपत्ति को सेट करने के आसपास सभी कॉल का विश्लेषण करता हूं और यह निर्धारित करने का प्रयास करता हूं कि आपकी बग कहां है।

एक और विचार: क्या मित्र ओबीजे कोर डेटा ऑब्जेक्ट है? यदि ऐसा है, तो इसे ManagedObjectContext में प्रारंभ किया जाना चाहिए।

+0

कोई कस्टम सेट अपवाद विधि नहीं है। यह सिर्फ एक स्ट्रिंग @property है। friendObject1 एक coredata ऑब्जेक्ट है जो डीबग करते समय गलती में है। हालांकि मैं बहुत चिंतित नहीं था क्योंकि मैंने सुना है कि मूल डेटा ऑब्जेक्ट्स 'गलती' स्थिति में हो सकते हैं यदि वे अभी तक पूरी तरह से हल नहीं हुए हैं। –

+0

तो friendObj एक NSManagedObject (कोर डेटा ऑब्जेक्ट) है इसे का उपयोग प्रारंभ किया जाना चाहिए [NSEntityDescription insertNewObjectForEntityForName: @ "classname" inManagedObjectContext: myManagedObjectContext] –

+0

friendObj एक NSManagedObject नहीं है - friendObj1 हालांकि है। –