在后台运行代码并获取返回代码

时间:2013-05-23 10:01:22

标签: ios objective-c

我有这个方法

    - (BOOL)connectedToInternet
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
                                    [NSURL URLWithString:@"http://www.google.com/"]];

    [request setHTTPMethod:@"HEAD"];

    NSHTTPURLResponse *response;

    [NSURLConnection sendSynchronousRequest:request
                          returningResponse:&response error: NULL];

    return ([response statusCode] == 200) ? YES : NO;
}

该方法需要几秒钟的时间才能完成,我可以在简单的条件下使用它来了解我是否有互联网连接。

有没有办法在后台线程中执行此操作而无需更改所有代码。

我这样称呼它

if([self connectedToInternet])

因此,如果我在后台线程中执行此操作,则无法获取返回值,然后我的方法无法返回值。

如果我必须改变所有它不值得。

我希望你能理解我的问题并感谢你的帮助。

4 个答案:

答案 0 :(得分:2)

在Apple" Reachability" Code Sample请注意reachabilityWithAddress:方法。

答案 1 :(得分:0)

你可以使用块做类似的事情;

定义(.h)

+ (void)isConnectedToInternet:(void (^)(BOOL connected))block;

实施(.m)

+ (void)isConnectedToInternet:(void (^)(BOOL))block
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
                                    [NSURL URLWithString:@"http://www.google.com/"]];

    [request setHTTPMethod:@"HEAD"];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;

        if (block) {
            block( ([httpResponse statusCode] == 200) ? YES : NO);
        }
    }];
}

然后将其称为

[MyClass isConnectedToInternet:^(BOOL connected) {
        if (connected) {
            // do stuff;
        }
    }];

答案 2 :(得分:0)

我不知道你想要做什么,但你想要使用的可能是:

dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
    //your asynchronous code here
});

但是通过使用if条件,你需要结果才能继续,不是吗?那么为什么要在后台运行代码?

答案 3 :(得分:0)

我建议您实施的方法是“了解互联网是否连接”并不是最优化的...几天之后我也试图实现同样的事情......我遇到了几个解决方案,通过互联网..我在我的博客上写了这篇文章.. Checking Internet connection in cocoa.

了解网络连接与否的首选方法是使用可达性类。您可以从以下代码中获得使用它的线索:NetworkCheckUtility.

希望这会有所帮助: - )