【问题标题】:Under what circumstances does dispatch_async(dispatch_get_main_queue(), ^ ... do nothingdispatch_async(dispatch_get_main_queue(), ^ ...什么情况下什么都不做
【发布时间】:2013-03-12 14:52:42
【问题描述】:

在完成例程中

[NSURLConnection sendAsynchronousRequest:request
                                   queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

我在打电话

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

我有两个测试应用程序,一个可以正常工作,另一个不能。发生的情况是日志语句不执行。队列是用

创建的
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 的错误。

【问题讨论】:

  • 尝试在dispatch_async 之前放置一个日志语句,以确保completionHandler 甚至正在运行。可能还有另一个问题。
  • 是的,我验证了那么多。 sendAsynchronousRequest 正在从主线程初始化,因此对 completionHandler 有运行循环支持。

标签: ios nsurlconnection objective-c-blocks


【解决方案1】:

好的,真正的问题是这个。如果你使用 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 修复了一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多