ios - dispatch_async 和 peformSelectorInBackground 的区别

标签 ios objective-c asynchronous

当我推送一个带有 MapViewViewController 时,我需要绘制一条路线。这需要大约 2 秒,所以我想在另一个线程中进行,因为我不想阻塞 UI。

我用过:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) ...

如果我在这里画画,大约需要 10 - 15 秒。

如果我使用 performSelectorInBackground 方法,路线将在约 1 或 2 秒后出现。

为什么? PRIORITY_HIGH 不应该很快吗?

最佳答案

你不应该在后台更新用户界面,真的任何事情都有可能发生。无论您使用 dispatch_async 还是 performSelectorInBackground: 都应该花费大约相同的时间来处理您的数据。您遇到的时间差异是 GUI 需要多长时间才能注意到后台发生了某些变化。我无法解释为什么这两种方法不同,这是一个未记录的实现细节。

正确的处理方式是在后台处理完数据后回调主线程更新你的UI。使用 GCD,这可能看起来像这样:

dispatch_queue_t queue = dispatch_get_global_queue( 0, 0 );
dispatch_async( queue, ^{
   id result = [self doExpensiveCalculation];
   dispatch_async( dispatch_get_main_queue(), ^{
        [self updateUIWithResult: result];
   } );
} );

尝试使用 GCD 和 performSelector... 方法一次实现此模式,您应该注意到时间上没有差异。

关于ios - dispatch_async 和 peformSelectorInBackground 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246069/

相关文章:

java - 内部有 CompletableFuture 的方法的单元测试

iphone - 多个 NSURLConnection 调用一个接一个?

iphone - 隐藏 UITableviewcell 的 UIButton

ios - 如何响应 Apple Watch 的表冠滚动?

ios - segue 后在 View 上保留标签栏?

ios - 当我通过 UIImageView 显示大图像时应用程序崩溃

objective-c - 创建用于写入的空文件?

没有main函数的iOS可执行文件

c# threading Timer 需要自己停止异步套接字代码

ios - 初始填充 UIImagePickerController 的图像