我一直在我的应用程序中成功地使用grand central dispatch,但我想知道使用这种东西的真正优势是什么:

dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff

甚至是

dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff

我的意思是,在这两种情况下,你都会触发一个挡路,让它在主线程上执行,而这恰恰是应用程序运行的地方,这无助于减少负载.在第一种情况下,您无法控制挡路何时运行.我见过块在您触发后半秒就被执行的情况.第二种情况类似于

[self doStuff];

正当

我想知道你们怎么看.

推荐答案

将块分配到主队列通常是从后台队列完成的,以表示某些后台处理已经完成.

- (void)doCalculation
{
    //you can use any string instead "com.mycompany.myqueue"
    dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);

    dispatch_async(backgroundQueue, ^{
        int result = <some really long calculation that takes seconds to complete>;

        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateMyUIWithResult:result];
        });    
    });
}

在本例中,我们在后台队列上执行冗长的计算,并且需要在计算完成后更新我们的UI.更新UI通常必须从主队列完成,所以我们使用第二个嵌套的DISPATCH_Async‘发信号’回主队列.

可能还有其他一些示例,其中您可能希望分派回主队列,但通常是以这种方式完成的,即从分派到后台队列的块中嵌套.

  • background processing finished -> update UI
  • chunk of data processed on background queue -> signal main queue to start next chunk
  • incoming network data on background queue -> signal main queue that message has arrived
  • 等,等等

至于你为什么要把主队调度到主队...通常情况下,您不会这样做,尽管可以想象,您这样做是为了在运行循环的下一次安排一些工作.

Ios相关问答推荐

2024 Beacon应用程序- startMonitoring(适用于:地区)或

如何在SwiftUI中绑定文本字段,同时仍使用它来存储Collection 夹?

如何使视图完全适合屏幕,而不会在旋转时溢出手机屏幕的边界?

如何防止UITest套件与Fastlane一起执行?

如何在 Swift 中存储具有关联值的协议?

为什么下面的代码没有在主线程上运行?

在 React Native iOS 中加载多个 JS 包

如何为 Firebase Auth 实施 Firebase AppCheck?

如何使用 Rxswift 处理程序最喜欢的按钮

为什么在Actor内部使用withTaskGroupwork并行运行?

SwiftUI - TextField - 在焦点上清除 Double 类型的值,在取消 Select 时恢复

通过 Rosetta 打开模拟器 xcode 14 以修复滚动

AppCenter 错误:/usr/bin/xcodebuild 失败,返回码:65

.onChange(of: ) 一次用于多个 @State 属性?

无法结合 UIImageView 旋转动画和 tableView 部分重新加载

将flutter android项目导入iOS

在 Xcode 4 中将静态库链接到 iOS 项目

命令 /Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang 失败,退出代码为 1

以编程方式创建按钮并设置背景图像

如何在 Objective-C 中组合两个数组?