2

在完成例程中

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

4

1 回答 1

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修复了一个错误。

于 2013-03-12T16:13:52.693 回答