互联网连接如何等待结果?

时间:2014-05-12 09:56:42

标签: ios networking

我有一个简单的应用程序,当没有互联网时它会显示一个空的tableView,从RSS加载文本。我想这样做,以便当没有互联网时,它会提供一些文字说没有可用的互联网和一个尝试重新连接的按钮。

为了做到这一点,我在this question中使用了Tony Million的Reachability类。 我在这样的函数中将布尔设置为YES和NO:

- (void)testInternetConnection
{
    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^
        {
            NSLog(@"Yayyy, we have the interwebs!");
            internetConnect = YES;
        });
    };

    // Internet is not reachable
    internetReachableFoo.unreachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^
        {
            NSLog(@"Someone broke the internet :(");
            internetConnect = NO;
        });
    };

    [internetReachableFoo startNotifier];
}

现在,当我尝试检查viewDidLoad函数中的boolean时,它将始终在函数完成之前返回。这是因为Reachability类在后台线程中。在继续之前,我不知道如何让我的代码等待结果。

所以我应该让我的代码等待结果,然后根据结果使tableView消失并用按钮将其更改为文本。

我想知道:

  1. 如何让我的代码等待后台线程的结果。
  2. 如何重新连接。 (用加载栏或其他东西让用户     知道它正在寻找连接。)

2 个答案:

答案 0 :(得分:0)

错误......为什么不把代码放在你想要继续进入块中?你真的需要那个BOOL吗?

您也可以将网络请求包装到可访问性块中,在没有连接时返回错误,将该特定错误连接到UI。


有点伪,但你明白了。重点是只有当你想要请求时才需要连接,每次我想都不需要监控。使用eppz!reachability,您可以根据需要获得可达性状态,其中一次调用块,而不是每次可达性更改时。

此外,您可能对您尝试联系的主持人感兴趣,而不是google.com。当google.com正常运行时,您的Feed无法访问。

-(void)fetchFeed
{
    [EPPZReachability reachHost:@"your.rss.host.com"
                     completion:^(EPPZReachability *reachability)
    {
        if (reachability.reachable)
        {
            [self hideRetryUI]; // UI

            [self fetchFeed:^(Feed *feed) // Networking
            { [self showFeed:feed]; }]; // UI (probably table view reload)
        }

        else
        {
            [self showRetryUI]; // UI
        }
    }];
}

-(IBAction)retryTouchedUp
{ [self fetchFeed]; }

答案 1 :(得分:0)

您还可以将可达性检查为

NSInteger reachabilityStatus = 0;

reachabilityStatus = [self checkNetworkReachability];
if (reachabilityStatus) {
   //network is available so perform network oriented task;
} else {
   // show an alert saying network is unavailable;
}

- (NSInteger)checkNetworkReachability {

    networkReachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];

    if (networkStatus == NotReachable) {
        NSLog(@"There IS NO internet connection");
    } else {
        NSLog(@"There IS internet connection");
    }

    return (NSInteger)networkStatus;
}