在什么情况下dispatch_async(dispatch_get_main_queue(),^ ......什么都不做

时间:2013-03-12 14:52:43

标签: ios nsurlconnection objective-c-blocks

的完成例程中
[NSURLConnection sendAsynchronousRequest:request
                                   queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

我正在打电话

dispatch_async(dispatch_get_main_queue(), ^
{
  NSLog(@"CALLING SUCCESS");
});

我有两个测试应用程序,其中一个正常工作,另一个没有。会发生什么是log语句不执行。队列是使用

创建的
queue = [[NSOperationQueue alloc] init];

让我疯了,根本就是拒绝执行。在这两种情况下,我在应用程序启动期间调用了它我尝试将呼叫延迟5秒钟。无论我做什么,它都不会在一个应用程序中执行块,而在另一个应用程序中执行。如果我有一些线索在什么情况下dispatch_async(dispatch_get_main_queue()...可能会失败,我可能能够辨别出差异。

请注意,在实际代码中,我调用的是一个我想在主线程上执行的块。我将测试用例简化为只调用NSLog。

更新:区别在于此代码在iOS 5.1模拟器上不起作用,但在6.0或6.1上有效。为什么呢?

更新2:好的,如果我使用默认的NSURLConnection它确实有效,但如果我使用

self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
[self.connection setDelegateQueue:queue];
[self.connection start];

它在iOS 5.1中不起作用。开始认为这可能是5.1中使用setDelegateQueue的错误。

1 个答案:

答案 0 :(得分:0)

好的,真正的问题是这个。如果使用NSURLConnection的类方法

+ (void)sendAsynchronousRequest:(NSURLRequest *)request
                      queue:(NSOperationQueue *)queue
          completionHandler:(void (^)(NSURLResponse *, NSData *, NSError *))handler

在iOS 5或6下,一切正常。

如果相反(就像我一样)你实现自己的连接处理程序,即通过实现NSURLConnectionDelegate和NSURLConnectionDataDelegate并调用

来将自己的等价物滚动到类方法(在我的情况下是为了避免缓存)
self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
[self.connection setDelegateQueue:queue];
[self.connection start];

然后dispatch_async将无法在iOS 5.X下运行,但可以在iOS 6.X下运行。我认为Apple修正了一个错误。