dispatch_async和peformSelectorInBackground之间的区别

Vla*_*dan 5 asynchronous objective-c ios

当我推ViewControllerMapView它,我需要画一个路线.这需要2秒钟,所以我想在另一个线程中进行此操作,因为我不想阻止UI.

我用了:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) ...
Run Code Online (Sandbox Code Playgroud)

如果我在这里进行绘图,则需要10到15秒.

如果我使用该performSelectorInBackground方法,路线在~1或2秒后出现.

为什么?不PRIORITY_HIGH应该快?

Sve*_*ven 0

你不应该在后台更新 UI,实际上任何事情都可能发生。您是否使用dispatch_asyncperformSelectorInBackground:应该花费大约相同的时间来处理您的数据。您所经历的时间差异是 GUI 需要多长时间才能注意到后台发生变化。我无法解释为什么这两种方法之间存在不同,这是一个未记录的实现细节。

\n\n

处理这个问题的正确方法是在后台处理完数据后回调到主线程来更新你的UI。对于 GCD,这可能看起来像这样:

\n\n
dispatch_queue_t queue = dispatch_get_global_queue( 0, 0 );\ndispatch_async( queue, ^{\n   id result = [self doExpensiveCalculation];\n   dispatch_async( dispatch_get_main_queue(), ^{\n        [self updateUIWithResult: result];\n   } );\n} );\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n