2011-05-05 12 views
7

का सही तरीके से उपयोग कैसे करें, मुझे विकास में अपने आईफोन ऐप के साथ एक बहुत ही अजीब दुर्घटना का सामना करना पड़ रहा था। ऐसा लगता है कि हर बार जब मैं अपने ऐप को किसी मित्र को दिखाता हूं तो यह दुर्घटनाग्रस्त हो जाएगा, लेकिन यह कभी भी क्रैश नहीं होगा। मर्फी के कानून पहलू द्वारा आम तौर पर रहस्यमय होने के बाद, मैंने क्रैश के पैटर्न को निर्धारित किया - न्यूयॉर्क सिटी सबवे। सबवे का उपयोग करने के बाद मेरा ऐप लगातार क्रैश हो जाता है। मैंने Reachability के उपयोग के लिए समस्या का पता लगाया है। किसी भी नेटवर्क स्थिति (हवाई जहाज मोड सहित नहीं) में इसका उपयोग करने के बाद अगली बार ऐप क्रैश हो जाता है। मैं एप्पल के दिशानिर्देशों का पालन कर रहा हूं और Reachability के साथ कनेक्शन के लिए जांच कर रहा हूं, इससे पहले कि मैं कोई अन्य नेटवर्क ऑपरेशंस करता हूं, लेकिन मुझे इसे कॉल करने के बारे में कुछ विवादित दस्तावेज मिल गए हैं।पहुंचने की स्थिति के बाद पहुंच योग्यता दुर्घटना का कारण बनती है - रीचैबिलिटी अतुल्यकालिक रूप से

वर्तमान में मैं कुछ इस तरह कर रहा हूँ:

-(BOOL)reachable { 
    Reachability *r = [Reachability reachabilityWithHostName:@"www.stackoverflow.com"]; 
    NetworkStatus internetStatus = [r currentReachabilityStatus]; 
    if(internetStatus == NotReachable) { 
     return NO; 
    } 
    return YES; 

}

जो मैं एक विधि viewDidAppear से कहा जाता है के साथ तुल्यकालिक फोन कर रहा हूँ।

if ([self reachable]== YES) { 
     ... do network stuff ... 

जो Reachability Guide for iOS 4

मेरा प्रश्न से कोड पर आधारित है: वहाँ Reachability के समुचित उपयोग है कि इस त्रुटि का ख्याल रखना और एक 3 जी या वाईफ़ाई नेटवर्क के अभाव संभाल लेंगे है? क्या मुझे एक और थ्रेड बनाने की आवश्यकता है या सिंक्रोनस कॉल को हटाने के लिए कुछ करना है?

यहां, वैसे, क्रैश लॉग है जो मुझे लगता है कि जब मेरा ऐप दुर्घटनाग्रस्त हो जाता है, जो मुझे लगता है कि यह एक तुल्यकालिक/असीमित समस्या है।

 

Application Specific Information: 
(app name) failed to resume in time 

Elapsed total CPU time (seconds): 3.280 (user 1.770, system 1.510), 33% CPU 
Elapsed application CPU time (seconds): 0.040, 0% CPU 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0: 
0 libsystem_kernel.dylib   0x30747fbc kevent + 24 
1 libsystem_info.dylib   0x30abec4e _mdns_search + 586 
2 libsystem_info.dylib   0x30abfb72 mdns_addrinfo + 370 
3 libsystem_info.dylib   0x30abfd68 search_addrinfo + 76 
4 libsystem_info.dylib   0x30ac1bcc si_addrinfo + 1080 
5 libsystem_info.dylib   0x30abd0b2 getaddrinfo + 78 
6 SystemConfiguration    0x311b4256 __SCNetworkReachabilityGetFlags + 962 
7 SystemConfiguration    0x311b4f1e SCNetworkReachabilityGetFlags + 98 

उत्तर

-1

मैंने इसे अपनी समस्या को एसिंक्रोनस के रूप में स्थापित करके हल किया। मैं फोन इस

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSTimer *timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(loadData) userInfo:nil repeats:NO]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
[pool release]; 

की तरह एक विधि और विधि कहा जाता है के रूप में ऊपर ही पहुंचा जा सकता कोड का उपयोग कर इस

- (void)loadData { 
    // check for reachability first before starting data load 
    if ([self reachable]== NO) { 
     // display error message that there is no internet connection, e.g. 
     UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Connection Error" message:@"Cannot load data. There is no internet connection." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Retry",nil]; 
     [errorAlert show]; 
     [errorAlert release]; 
    } else { 
     // do something to load data from internet ...  
    } 

} 

तरह दिखता है।

मैं हमेशा इस तरह रीचैबिलिटी का उपयोग करता हूं - उदाहरण है कि ऐप्पल देता है अधूरा है। मेरे पास यह कोड कुछ महीनों के लिए एक पूर्ण ऐप पर चल रहा है और यह बहुत स्थिर रहा है।

संपादित करें: इस कोड को नहीं रह गया है iOS 5 के रूप में स्थिर है - यह अब कभी-कभी "की अनुमति समय से परे सक्रिय दावे" की वजह से कुचल सकता है। ऐप्पल ने अपने दस्तावेज़ और उदाहरण कोड को अपडेट किया है क्योंकि मैंने यह प्रश्न लिखा है, इसलिए मैं दूसरे जवाब में लिंक का पालन करने का सुझाव देता हूं।

4

तुल्यकालिक मामले में, आप शायद आईओएस एप्लिकेशन वॉचडॉग द्वारा मारे जा रहे हैं। ऐसा इसलिए है क्योंकि पहुंच क्षमता जांचने के लिए, एससीनेटवर्क रीचैबिलिटी कार्यक्षमता को एक DNS लुकअप करने की आवश्यकता है जिसमें 30 सेकंड तक लग सकते हैं। यदि मुख्य धागे पर पहुंच पहुंचने की जांच करें (यानी ,डिडएपियर में) आप मुख्य थ्रेड को संभावित रूप से लंबे समय तक अवरुद्ध करते हैं, तो आईओएस सोचता है कि आपका ऐप लटका हुआ है और एप्लिकेशन वॉचडॉग 20 सेकेंड के बाद इसे मार देता है।

एप्पल भी Reacahbility नमूना कोड में इस बारे में चेतावनी देते हैं:

Apple Reachability Sample Code README

बस गम्यता नमूना अनुप्रयोग में की तरह सूचनाओं का उपयोग --- यह अच्छी तरह से काम करता है और बिल्कुल स्पष्ट है एक बार आप NSNotificationCenter डिज़ाइन पैटर्न grok ।

शुभकामनाएं!

+0

धन्यवाद - इसलिए यदि मुख्य धागा मारा गया था, तो क्या मैं इसे देखकर देख रहा था जब मैं इसे सिंक्रनाइज़ कर रहा था? (आवेदन अगली बार दुर्घटनाग्रस्त होने के बाद सिंक्रोनस चेक के बाद चला जाता है) –

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