2013-05-23 3 views
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]) 

Так что, если я это делать в фоновом потоке я не могу получить возвращаемое значение, а затем мой метод не может вернуть значение.

Если мне нужно изменить все, что не стоит.

Я надеюсь, что вы сможете понять мой вопрос и поблагодарить за любую помощь.

+0

Почему вы не можете получить возвращаемое значение для запуска его на фоновом потоке? –

+0

если я использую [NSThread detachNewThreadSelector:], чтобы запустить его, я не могу получить возвращаемое значение по тому же методу. я должен был бы отправить возврат к другому методу, а затем вызов не будет работать нетронутым. – Nanoc

+0

@userXXX Как насчет обратного вызова? –

ответ

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; 
     } 
    }]; 
+0

Это может быть то, что мне нужно, но xcode говорит, что я не могу ответить на запрос внутри блока Нет видимого интерфейса для NSURLResponse ... – Nanoc

+0

да, исправил это сейчас. – Bartu

+0

Действительно, спасибо, он работает отлично! :) – Nanoc

0

Я не знаю, что именно то, что вы хотите do, но то, что вы хотите использовать, возможно:

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

Но, используя условие if, вам нужен результат, чтобы продолжить, не так ли? Итак, зачем использовать код в фоновом режиме?

+0

Точка, мне нужен результат, но я не хочу блокировать нить ui – Nanoc

0

Я бы предложил метод, который вы реализуете, чтобы знать, «если Интернет подключен или нет», не самый оптимизированный ... Несколько дней назад я также пытался реализовать одно и то же ... и я наткнулся на пару решений, через интернет .. и я писал об этом в своем блоге .. Checking Internet connection in cocoa.

Мой предпочтительный способ узнать, если сеть подключена или нет, с помощью достижимости класса. Вы можете получить подсказку по его использованию из этого кода: NetworkCheckUtility.

Надеется, что это помогает :-)

2

В «достижимости» Code Sample ноты от Apple метод reachabilityWithAddress: пожалуйста.

Смежные вопросы