ios - dispatch_async 是否可以中断调用任务

标签 ios objective-c swift grand-central-dispatch

假设我将任务异步分派(dispatch)到队列:

{
    // we are on main queue

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      print("task B")
    });

    print("task A")

    // some long running work

    print("task A")

    // some long running work

    print("task A")
    ...
}

在任何情况下,分派(dispatch)的任务都可以中断从中分派(dispatch)它的任务吗?换句话说,是否会在打印所有“任务 A”之前打印“任务 B”?

task A
task B
task A
task A
...

或者 GCD 将保证:

task A
task A
task A
...
task B

如果将任务分派(dispatch)到调用 dispatch_async 的同一个队列,会有什么不同吗?

最佳答案

In other words, can it ever happen that "task B" gets printed before all "task A"-s are printed?

这绝对有可能发生。如果您异步调度到 (a) 不同的队列;或 (b) 并发队列(全局队列是并发队列),您明确要求它们彼此并发运行。

AB 日志消息的确切顺序取决于各种任务的耗时、队列的优先级等。但是如果您希望 B 在所有 A 任务完成后才出现,那么您应该显式控制该行为(通知调度组、串行队列、屏障等的 block 。 ).

如果您告诉我们您想要保证什么行为,我们可以告诉您如何去做。

关于ios - dispatch_async 是否可以中断调用任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629986/

相关文章:

objective-c - 如何在ios中获取接入点的mac地址?

ios - 增加高度约束,拉伸(stretch) "Runtime added subviews"

ios - RestKit关系映射

iOS CLLocationManager : Removing spikes

swift - 在 SwiftUI 文档应用程序中,如何从函数中保存文档

ios - UIView动画最后被取消

ios - 启用分页功能的 ScrollView 从左到右滚动 - iOS

ios - 访问 UIImagePickerController 相机 View 的顶部栏

ios - 我应该在 applicationWillTerminate 中删除观察者吗?

ios - 错误 : 'OneSignal/OneSignal.h' file not found #import <OneSignal/OneSignal. h>