gpt4 book ai didi

ios - 在什么情况下dispatch_async(dispatch_get_main_queue(),^…什么都不做

转载 作者:行者123 更新时间:2023-12-01 16:51:26 28 4
gpt4 key购买 nike

在完成例程中

[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中不起作用。开始认为这可能是setDelegateQueue在5.1中的错误。

最佳答案

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

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

关于ios - 在什么情况下dispatch_async(dispatch_get_main_queue(),^…什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15364547/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com