2014-11-12 2 views
0

У меня есть этот код:Objective-C - sendAsynchronousRequest ничего не делает?

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/"]]; 
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    NSLog(@"handler block executed!\n");    
}]; 

Проблема заключается в том, что блоки обработчик не работает. Он никогда не исполняется.

Я прочитал на Xcode документации это:

A completion handler block that runs whenever the transfer finishes or fails. 

Итак, почему всякий раз, когда я выполняю этот код, блок обработчик не работает? Он должен работать, даже если вызов завершается неудачно, не так ли?

+2

Первичная очередь освобождается от очереди? Попытайтесь сохранить ссылку на него где-то с пожизненным> соединением. – Kevin

+0

Да. Это была проблема. Спасибо друг! – jndok

ответ

0

ОК, я нашел решение благодаря Кевину. Проблема заключалась именно в том, что ARC освобождал NSOperationQueue до вызова блока обработчика. Я нашел фрагмент на this japanese blog.

#import <Foundation/Foundation.h> 
#import <dispatch/dispatch.h> 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
     NSURL *url = [NSURL URLWithString:@"http://www.google.com/"]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

     dispatch_semaphore_t s = dispatch_semaphore_create(0); 

     [NSURLConnection sendAsynchronousRequest:request 
      queue:queue 
      completionHandler:^(NSURLResponse *r, NSData *d, NSError *e) { 
      NSLog(@"%@", r); 
      dispatch_semaphore_signal(s); 
     }]; 

     dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER); 
     dispatch_release(s); // <= remove this if you are using ARC. 
    } 
    return 0; 
} 
Смежные вопросы