示例Objective-C代码可以有效地对线程安全回调进行排队



我查看了苹果的GCD指南,发现它对于我想要实现的目标来说相当长。我正在开发一款iOS SpriteKit游戏(使用Objective-C),我需要为两个简单的任务使用并发:

  • 在启动后立即显示进度条,同时在单独的线程/队列中执行所有初始化逻辑。我知道如何使用经典的posix线程来实现这一点,但在GCD中是否有更高效的等效线程
  • 定期将用户进度保存在单独的线程/队列下,以避免影响UI帧速率/响应能力。听起来GCD队列可能非常适合这里,所以我的问题是如何使用GCD在辅助线程下对回调块进行排队

在这两种情况下,都没有并发相关数据损坏的风险,而且我不需要执行跨线程通信(不需要任何同步)。

带有示例代码的答案将是完美的。

我不确定它是否会更有效率,但会产生更好的代码。。。

系统提供了一些带有gcd的默认后台队列,您可以使用这些队列,而不是创建自己的队列,然后它会在认为最有益的时候将队列上的内容卸载到其他线程。要做到这一点非常简单:

----SWIFT----

// Dispatch a block of code to a background queue
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) { 
    // Do initialisation in the background
    ...
    // Call back to the main queue if you want to update any UI when you are done
    dispatch_sync(dispatch_get_main_queue()) {
        // Set progress indicator to complete?
    }
}
// Handle the progress indicator while the initialisation is happening in the background

----对象-C----

// Dispatch a block of code to a background queue
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, { 
    // Do initialisation in the background
    ...
    // Call back to the main queue if you want to update any UI when you are done
    dispatch_sync(dispatch_get_main_queue(), {
        // Set progress indicator to complete?
    });
});
// Handle the progress indicator while the initialisation is happening in the background

这很好,也很简单,它将初始化分派到后台队列中,并在完成后回调到主线程,然后继续更新进度指示器。

始终重要的是要记住,您不能从主队列以外的任何队列更新UI。

希望这有帮助,让我知道,如果我可以更清楚。

相关内容

  • 没有找到相关文章

最新更新