0

我有这个方法

    - (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

4 回答 4

2

请在 Apple 的“可达性”代码示例中注意该reachabilityWithAddress:方法。

于 2013-05-23T10:20:50.530 回答
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;
        }
    }];
于 2013-05-23T10:07:56.453 回答
0

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

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

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

于 2013-05-23T10:08:36.463 回答
0

我建议您实施的方法来了解“是否已连接互联网”不是最优化的方法...几天前我也尝试实施相同的事情..我遇到了几个解决方案互联网..我在我的博客上写过..检查可可的互联网连接。

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

希望这可以帮助 :-)

于 2013-05-23T10:14:46.083 回答