你在哪里打电话给Reachability?

时间:2012-11-06 06:02:32

标签: objective-c ios reachability

我正在尝试在我的应用中实现可达性。我在applicationDidFinishLaunching中有。如果我的连接非常糟糕并且我启动了应用程序,则Reachability将永远耗尽并经常使用The application failed to launch in time错误消息使应用程序崩溃。

所以相反,我尝试在后台线程中调用Reachability。但是当我这样做时,我不再收到Reachability通知。

我应该在哪里打电话给Reachability?

修改

我根据下面的建议添加了TonyMillions的可达性代码,但在非常糟糕的网络条件下,我仍然遇到相同的application failed to load in time错误。要重现我所看到的内容,请转到Settings.app - >开发者 - >网络链接调节器,将其打开并将其设置为100%损失。

您的应用仍然在这种情况下加载吗?

3 个答案:

答案 0 :(得分:2)

在Github上使用Tony Millions可达性项目。

https://github.com/tonymillion/Reachability

然后在我的app委托中,我只是放入applicationdidfinishlaunching

self.reachability = [Reachability reachabilityForInternetConnection];

[self.reachability startNotifier];

然后当状态改变时,这将被称为

#pragma mark - Reachability

- (void)reachabilityChanged:(NSNotification *)note {

    NetworkStatus ns = [(Reachability *)[note object] currentReachabilityStatus];

    if (ns == NotReachable) {

        if (![self.networkAlert isVisible]) {

            if ([self networkAlert] == nil) {

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"\n\nNo Internet Connection" message:@"You require an internet connection to communicate with the server." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
                [self setNetworkAlert:alert];
            }

            [self.networkAlert show];  
        }
    } else {

        if ([self networkAlert] != nil) {

            [self.networkAlert dismissWithClickedButtonIndex:0 animated:YES]; 
        }
    }
}

答案 1 :(得分:0)

  

相反,我在后台线程中调用了Reachability。但   当我这样做时,我不再收到可达性通知。

当你在后台线程中调用Reachability时,你应该在后台运行循环中安排Reachability并确保后台线程runloop正在运行。

在后台线程中执行:

  1. 创建可达性对象,

    可达性*可达性= [Reachability reachabilityWithHostName:@“www.google.com”];

  2. [可达性startNotifier];

  3. [[NSRunLoop currentRunLoop] run];

  4. 这可能有用,但建议在主线程中安排通知程序。

答案 2 :(得分:0)

TonyMillion帮助我在GitHub上解决了这个问题。

如果你正在使用他的Reachability替换,你所要做的就是包裹startNotifier这样的呼叫:

dispatch_async(dispatch_get_global_queue(0,0), ^{
    [self.internetReach startNotifier];
});

该应用程序将无法在恶劣的网络条件下启动,您仍然会在主线程上收到通知。