不断调用方法

时间:2012-01-22 19:01:29

标签: objective-c

所以我有一个检查互联网连接的方法,但仅限于-(id):init方法。我可以设置它以便不断检查连接吗?如果有帮助,请输入以下代码:

- (id) checkConnected
    {

        NSError *error = nil;
        NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"] encoding:NSASCIIStringEncoding error:&error];
        if (URLString != NULL)
            {
                connected = YES;
            }
        else connected = NO;

        if(connected == YES)
            NSLog(@"Connected");
        else if (connected == NO)
            NSLog(@"NotConnected");

        return self;
    }

1 个答案:

答案 0 :(得分:0)

虽然Reachability是一个很好的首过检查,正如其他人所建议的那样,它只测试否定的情况:是否不可能建立连接?如果防火墙阻止您,或者远程服务器出现故障,或者其他任何事情发生,可达性可能会告诉您系统原则上是可达的(即您有网络连接而主机是否可路由)但主机是实际上并不可达。

因此,对于某些应用程序,您所要求的并非不合理。你必须要小心的是不要用常量测试来阻止你的主线程。以下是一些将在后台重复运行测试的代码:

NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
__block NSHTTPURLResponse *response = nil;
__block NSError *error = nil;
dispatch_queue_t netQueue = dispatch_queue_create("com.mycompany.netQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(netQueue, ^{
    while (! [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error]) {
        NSLog(@"Connection failed.");
    }
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Connection succeeded");
    });
});
dispatch_release(netQueue);

如果记录了“连接成功”,则可以编写一些在连接成功时运行的主线程代码。请注意,我从块外传递* response和* error,因此它们也可以在块内部或外部的主线程上使用(假设您将它们保留在范围内)供您使用。

您可能想要限制(即不使用while()),但这是一个实现细节。使用NSTimer(),正如理查德建议的那样。

最后,即使使用此代码,您仍然需要处理后续连接的潜在故障。仅仅因为它工作一次并不意味着连接在一毫秒之后可用。