2012-04-11 24 views
6

पर पहुंचने योग्य समय समाप्ति को परिभाषित करने के लिए कैसे मैं यह जानने के लिए रीचैबिलिटी क्लास का उपयोग करता हूं कि मेरे पास इंटरनेट कनेक्शन उपलब्ध है या नहीं। समस्या तब होती है जब वाईफाई उपलब्ध है लेकिन इंटरनेट नहीं, - (NetworkStatus) currentReachabilityStatus विधि बहुत अधिक समय लेती है।आईओएस

मेरी कोड:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"]; 
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

आवेदन "फ्रीज" अस्थायी रूप से दूसरी लाइन पर। इस प्रतीक्षा के लिए अधिकतम समय कैसे परिभाषित करें?

+0

वाईफ़ाई इंटरनेट उपलब्ध है, लेकिन नहीं? इसका क्या मतलब है?? –

+5

इसका मतलब यह है कि राउटर और आईपैड के बीच वाईफाई कनेक्शन ठीक है, लेकिन कोई इंटरनेट कनेक्शन उपलब्ध नहीं है। – Anthony

+0

ठीक है .. समझ गया। :) –

उत्तर

3

मुझे ऐसा नहीं लगता है। लेकिन सबसे महत्वपूर्ण बात यह है कि मुझे नहीं लगता कि आप चाहते हैं कि आप कर सकें (आपको झूठी सकारात्मक मिल सकती है)। पहुंचने योग्यता को अपना कोर्स चलाने दें।

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

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

0

मुझे एक ही चीज़ के साथ समस्याएं थीं लेकिन मुझे टाइमआउट निर्दिष्ट करने का कोई तरीका मिला। मैंने ऐप्पल से रीचैबिलिटी क्लास के अंदर इस विधि को बदल दिया।

- (NetworkStatus)currentReachabilityStatus 
{ 
NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL  SCNetworkReachabilityRef"); 
//NetworkStatus returnValue = NotReachable; 
__block SCNetworkReachabilityFlags flags; 

__block BOOL timeOut = NO; 
double delayInSeconds = 5.0; 

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){ 

    timeOut = YES; 

}); 

__block NetworkStatus returnValue = NotReachable; 

__block BOOL returned = NO; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) 
    { 
     if (_alwaysReturnLocalWiFiStatus) 
     { 
      returnValue = [self localWiFiStatusForFlags:flags]; 
     } 
     else 
     { 
      returnValue = [self networkStatusForFlags:flags]; 
     } 
    } 
    returned = YES; 

}); 

while (!returned && !timeOut) { 
    if (!timeOut && !returned){ 
     [NSThread sleepForTimeInterval:.02]; 
    } else { 
     break; 
    } 
} 

return returnValue; 
}