在检查互联网连接时iOS应用冻结

时间:2013-06-25 09:26:57

标签: ios reachability

在我的初始视图控制器的 viewDidLoad 中,我检查互联网连接,如果可用,则启动一些下载过程。

如果没有任何连接(WiFi或移动)或互联网可用 - 一切正常。 但是,如果设备连接到没有互联网的WiFi,应用程序冻结。

if ([self isInternetAvail]) {
    [[Download sharedDownload] startUpdateProcessWithIndicatorInViewController:self];
}

这是功能:

- (BOOL)isInternetAvail
{
    NSString *hostName = @"google.com";
    Reachability *hostReach = [Reachability reachabilityWithHostName:hostName];
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];
    if (netStatus == NotReachable) {
       return NO;
    } else {
       return YES;
    }
}

应用程序冻结在这一行:

NetworkStatus netStatus = [hostReach currentReachabilityStatus];

检查互联网连接的更正确方法是使用NSNotificationCenter,但在这种情况下:

1) didFinishLaunchingWithOptions

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(networkStateChanged:)
                                             name:kReachabilityChangedNotification
                                           object:nil];

hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];
[hostReach startNotifier];
[self updateInternetAvailWithReachability: hostReach];

其他方法:

- (void)updateInternetAvailWithReachability: (Reachability *)curReach
{
    netStatus = [curReach currentReachabilityStatus];  
}

- (void)networkStateChanged:(NSNotification *)notification
{
    Reachability *curReach = [notification object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    [self updateInternetAvailWithReachability:curReach];
}

2)在我的初始视图控制器的 viewDidLoad 中:

AppDelegate *d = (AppDelegate *)[[UIApplication sharedApplication] delegate];
if (!d.netStatus == NotReachable) {
   [[Download sharedDownload] startUpdateProcessWithIndicatorInViewController:self];
}

在此步骤中,我得到 NotReachable ,无法开始下载

3) NSNotificationCenter告诉我“互联网可用”

我需要一些建议如何准备这个。

1 个答案:

答案 0 :(得分:0)

当您请求服务器然后减少timeoutInterval选项并将其设置为最小值,以便请求不会等待很长时间以通过这种方式获得响应,您可以减少冻结应用程序的时间。如果你想完全摆脱它,那么你应该在后台线程的另一个线程上运行所有进行网络检查的过程。