2011-04-18 16 views
9

मेरे पास एक नेविगेशन आधारित ऐप है। मुख्य दृश्य पर एक बटन दबाएं, फिर मैं नेविगेशन नियंत्रक को एक नया दृश्य दबाता हूं। सभी सुंदर मूल सामान।asihttprequest मेरे ऐप को क्रैश करता है

जब नया दृश्य लोड होता है, तो मैं कुछ जेसन डेटा लाने के लिए ASIHTTPRequest करता हूं, जो छवि यूआरएल की एक सूची है। फिर मैं लूप के लिए करता हूं, ASIHTTPRequests का एक गुच्छा बनाते हैं, उन्हें एक कतार में जोड़ें और फिर कतार चलाएं।

लेकिन अगर मैं कतार समाप्त होने से पहले बैक बटन पर क्लिक करता हूं, तो ऐप क्रैश हो जाता है, यह ऐप घर प्रदर्शित करता है और कहता है कि आप गलत घर चुनते हैं, किसी भी फोटो प्रदर्शित होने से पहले, बहुत जल्दी वापस क्लिक करें, बम क्रैश।

यह धागा http://groups.google.com/group/asihttprequest/browse_thread/thread/3d4815198aa889b9 मेरी समस्या को अच्छी तरह से बताता है, सिवाय इसके कि मैं दृश्य पर सभी अनुरोधों को रद्द कर देता हूं, प्रतिनिधि को शून्य पर सेट करता हूं और कतार जारी करता हूं।

फिर भी मैं दुर्घटनाग्रस्त हूं। अगर मैं 3 जी का उपयोग करता हूं तो मैं हर बार बहुत दुर्घटनाग्रस्त हूं, लेकिन वाईफाई पर इसे क्रैश करना मुश्किल है, लेकिन काफी कामयाब है।

लगभग 80% मामलों में डिबगर ASIHTTPRequest.m में इस लाइन के लिए कूदता है

(void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders { 
    if ([self error] || [self mainRequest]) { return; } 
--> if (delegate && [delegate respondsToSelector:didReceiveResponseHeadersSelector]) { 

कई कई मामलों में यह कूदता करने के लिए: उदाहरणों में से एक मुट्ठी इसे करने के लिए चला जाता है में

(void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders { 
    if ([self error] || [self mainRequest]) { return; }  
---> if (delegate && [delegate respondsToSelector:didReceiveResponseHeadersSelector]) { 

विज्ञापन मेरी मुख्य पाश

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
--> int retVal = UIApplicationMain(argc, argv, nil, nil); with SIGBART error [pool release]; return retVal; 

मैं एमबीपी और मैकप्रो, नवीनतम ओएस एक्स, एक्सकोड 4.0.2 का उपयोग कर रहा हूं और मैं सभी पर परीक्षण करता हूं मूल iPhones को छोड़कर पाइप डिवाइस।

मैं वास्तव में अपना पूरा ऐप फिर से लिखना नहीं चाहता हूं, लेकिन क्या वहां कुछ और है जो ASIHTTPRequest से तुलना करता है?

उत्तर

3

त्रुटि है कि प्रतिनिधि अभी भी सेट कर दिया जाता है।

मैं इसे ठीक करने के लिए 2 तरीके मिल गया है।

तरह से मैं बदसूरत विचार है कि आप एक सार्वभौमिक प्रतिनिधि जब एप्लिकेशन पहली बार चलाने है कि सभी नेटवर्क यातायात करता है और instantiated है बनाते हैं। मैंने वास्तव में ऐप प्रतिनिधि का उपयोग किया और nnnotification केंद्र संदेशों को सुनो। यह एक आकर्षण की तरह काम करता है, ऐप कभी दुर्घटनाग्रस्त नहीं होता है, लेकिन मुझे लगता है कि यह इष्टतम नहीं है।

सबसे अच्छा तरीका प्रतिनिधि स्थापित करने के लिए नहीं है और "setDidFinishSelector" का उपयोग नहीं है, लेकिन बजाय ":^setCompletionBlock" का उपयोग करें। यह केवल आईओएस 4.0 और ऊपर चलने वाले उपकरणों पर काम करेगा, जो 90-95% से अधिक है और बढ़ रहा है। यह सिर्फ एक शानदार तरीका है और एप्लिकेशन को दुर्घटनाग्रस्त नहीं करेगा।

+0

शानदार उत्तर, यह काम कर रहा है – KsK

+0

दूसरे दृष्टिकोण का उपयोग वास्तव में काम करता है। धन्यवाद। मैं इस पर बहुत लंबे समय तक अटक गया था। चीयर्स। –

3

आपको कुछ भी बेहतर नहीं मिलेगा कि ASIHTTPRequest, समस्या यह होगी कि आप इसका उपयोग कैसे कर रहे हैं और नेविगेशन पर प्रतिनिधियों को गायब करने के लिए एक आम समस्या है।

ऐसा लगता है कि आपकी समस्या व्यू कंट्रोलर से संबंधित है जो उपयोगकर्ता नेविगेशन के कारण कतार को नष्ट कर रही है। मुझे इन मुद्दों को हल करने का सबसे अच्छा तरीका मिलना एक केंद्रीय मॉडल वर्ग है जो मेरे सभी संचारों को संभालता है और उस कक्षा को पूरे एप्लिकेशन लाइफसाइकिल में रखता है।

इस तरह से जब आप प्रतिनिधि अप्रत्याशित रूप से गायब हो जाते हैं तो आपको अनजान क्रैश नहीं मिलते हैं।

विकल्प 2

एक और दृष्टिकोण उपयोगकर्ता नेविगेशन निष्क्रिय करने के लिए जब तक नेटवर्क आपरेशन पूरा करता है हो सकता है। पूरी स्क्रीन पर एक मोडल व्यू डालें जो यूआईएक्टिविटीव्यू दिखाता है ताकि उपयोगकर्ता जानता है कि उनके कार्यों को अवरुद्ध किया जा रहा है। फिर डेटा पहुंचने पर आप मोडल व्यू को बंद कर सकते हैं। यदि आप स्क्रीन को ढाल के साथ अच्छी तरह डिज़ाइन करते हैं तो पृष्ठभूमि बस थोड़ा सा मंद हो जाती है, यह ठीक दिख सकती है। लेकिन यह वास्तव में सबसे अच्छा तरीका नहीं है - आपको इसके बजाय प्रतिनिधि एडब्ल्यूओएल को ठीक करना चाहिए।

हमें सटीक समस्या को खोजने के लिए कतार निर्माण, विनाश आदि से संबंधित कोड को और अधिक देखने की आवश्यकता है।

+0

कैसे इस तरह के एक केंद्रीय वर्ग की तरह लग रहे हैं? –

+0

मुझे लगता है कि एक केंद्रीय वर्ग एक सिंगलटन होगा। –

+0

या तो एक सिंगलटन या एक वर्ग जिसे केवल एक बार तुरंत चालू किया जाता है और ऐप प्रतिनिधि द्वारा बनाए रखा जाता है। – Roger

1

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

+0

क्या आप समझा सकते हैं कि मैं ऐसे सिंगलटन प्रतिनिधि बनाने के बारे में कैसे जाऊंगा, या क्या मैं केवल ऐप प्रतिनिधि का उपयोग करूंगा? आपको लगता है कि दिलचस्प लगता है लेकिन मैं इसे पूरी तरह से चित्रित नहीं कर सकता। –

+0

बस ऐप प्रतिनिधि का उपयोग करें। या आप ऐप प्रतिनिधि द्वारा स्वामित्व वाले सिंगलटन बना सकते हैं। आप अधिक जानकारी के लिए "कोको सिंगलटन" के लिए SO खोज सकते हैं। –

12

-viewDidUnload के बजाय -viewWillUnload में प्रतिनिधि को रद्द और अनसेट करने का प्रयास करें। मुझे उस समय की खिड़की पर संदेह है जिसमें यह वास्तव में अनलोडिंग है (उन दो UIViewController विधियों को कॉल करने के बीच) वह समय है जब आप दुर्घटनाग्रस्त हो जाते हैं। प्रतिनिधि चले गए हैं, लेकिन आपने अभी तक अपने ASIHTTPRequest ऑब्जेक्ट को नहीं बताया है।

+6

दृश्य में WillDissapear, ऐसा लगता है कि चाल चल रही है, कम से कम मैं इसे क्रैश करने में असमर्थ था। हालांकि मैंने यह सुनिश्चित करने के लिए निम्न कोड जोड़ दिया है: - (शून्य) viewWillDisappear: (BOOL) एनिमेटेड { [सुपर व्यूविल डिस्प्लेयर: एनिमेटेड]; के लिए (ASIHTTPRequest * [कतार संचालन] में अनुरोध) { [अनुरोध clearDelegatesAndCancel]; [req setDelegate: nil]; [req setDidFailSelector: nil]; [req setDidFinish चयनकर्ता: शून्य]; } [कतार रद्द करेंऑपरऑपरेशंस]; [कतार सेट डिलीगेट: शून्य]; } –

संबंधित मुद्दे