可连接到互联网的连接

时间:2012-11-27 17:31:29

标签: ios xcode

我只想执行一些代码,并且只有在我连接到互联网时才会执行:

//Reachability

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

Reachability * reach = [Reachability reachabilityWithHostname:@"www.dropbox.com"];

reach.reachableBlock = ^(Reachability * reachability)
{
    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"Block Says Reachable");

        connect = @"yes";

    });
};

reach.unreachableBlock = ^(Reachability * reachability)
{
    dispatch_async(dispatch_get_main_queue(), ^{

        connect = @"no";


    });

};

[reach startNotifier];

//Reachability

if (connect == @"no") {

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"There is no internet connection. Please connect to the internet. If you are already connected, there might be a problem with our server. Try again in a moment." delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

} else if (titleSet == NULL){

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"Please select a group or create a new one" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

}else if (NavBar.topItem.title.length < 1){

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"Please select a group or create a new one" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

} else if (newmessagename.text.length < 4){

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"Please give a name to your event that is at least 4 characters long" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

}

似乎代码没有按顺序执行。我认为检查Internet连接所花费的时间比执行代码要多。我怎样才能解决这个问题? 请不要告诉我将代码直接放在connect = @"no";所在的括号中。

2 个答案:

答案 0 :(得分:0)

块未按顺序执行,它们以异步方式执行

这意味着您无法分辨何时将调用块内的代码。使用该块的代码可以在方法的其余部分之前完成并执行(但这不太可能,尤其是在Internet连接时)。

您应该将ifs放在有效时间调用的方法中。这一次可能是您收到来自您的区块的回复,或者,如果我的记忆为真,[reach startNotifier];可以在可达性状态发生变化时通知您,这似乎是您的reachabilityChanged:方法:

-(void) reachabilityChanged:(id) parameter
{
   //Query reachability and notify / cache as required.
} 

答案 1 :(得分:0)

当然它没有按顺序执行,这些方法的重点是在你获得可达性响应时阻止ui冻结。基本上,您设置了可达性响应,并在尚未检查任何内容时立即询问结果。你必须要把它移到括号内。

您可以做的其他事情是使用这些结果创建一个函数,并在两个块中调用此函数。

如果您希望在视图控制器的加载时或在显示其他内容之前进行此操作,则必须在显示此控制器之前检查是否具有可访问性,或者添加“加载”屏幕。

编辑:其他我不理解的是,那些可达性方法在获得结果时似乎触发了一个块,但您也在注册通知。而且我没有看到你发布通知。您在这里使用了2个异步程序(块和通知)