在
的完成例程中[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的错误。
答案 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修正了一个错误。