2012-04-11 30 views
6

Tôi sử dụng lớp Khả năng hiển thị để biết liệu tôi có kết nối Internet hay không. Vấn đề là khi wifi có sẵn nhưng không có internet, phương pháp - (NetworkStatus) currentReachabilityStatus mất quá nhiều thời gian.Cách xác định thời gian chờ khả năng hiển thị trên ios

mã của tôi:

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

Ứng dụng "đóng băng" tạm thời trên dòng thứ hai. Làm thế nào để xác định thời gian tối đa cho việc chờ đợi này?

+0

wifi khả dụng nhưng không có internet? Điều đó nghĩa là gì ?? –

+5

có nghĩa là kết nối wifi giữa bộ định tuyến và iPad là ok, nhưng không có kết nối internet. – Anthony

+0

ok .. hiểu rồi. :) –

Trả lời

3

Tôi không nghĩ vậy. Nhưng quan trọng hơn, tôi không nghĩ rằng bạn muốn nếu bạn có thể (bạn có thể nhận được dương tính giả). Hãy để Reachability chạy nó là khóa học.

Nếu bạn xem dự án trình diễn khả năng hiển thị, khái niệm không phải là gọi reachabilityWithHostName và kiểm tra currentReachabilityStatus khi bạn cần Internet. Bạn gọi currentReachabilityStatus tại trong ứng dụng didFinishLaunchingWithOptions của đại biểu ứng dụng, thiết lập thông báo và Khả năng hiển thị sẽ cho biết bạn khi kết nối Internet đã thay đổi. Tôi thấy rằng kiểm tra tiếp theo để currentReachabilityStatus là rất nhiều nhanh (bất kể kết nối) khi tôi (a) khả năng tiếp cận thiết lập khi khởi động; nhưng (b) kiểm tra kết nối theo cách đúng lúc.

Và nếu bạn hoàn toàn cần bắt đầu xử lý của mình ngay lập tức, thì câu hỏi là liệu bạn có thể đẩy điều đó vào nền (ví dụ: dispatch_async()). Ví dụ: ứng dụng của tôi truy xuất thông tin cập nhật từ máy chủ nhưng vì điều đó xảy ra ở chế độ nền, cả tôi và người dùng của tôi đều không nhận thấy bất kỳ sự chậm trễ nào.

0

Tôi đã gặp sự cố với cùng một điều nhưng tôi đã tìm ra cách để chỉ định thời gian chờ. Tôi đã thay thế phương thức này bên trong Lớp Khả năng hiển thị từ Apple.

- (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; 
} 
Các vấn đề liên quan