示例Objective-C代码有效地排队线程安全回调

时间:2016-04-15 18:49:28

标签: ios objective-c multithreading grand-central-dispatch

我正在检查Apple的GCD指南,发现它对我想要实现的目标非常漫长。我正在开发一个iOS SpriteKit游戏(使用Objective-C),我需要使用并发来完成两个简单的任务:

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

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

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

1 个答案:

答案 0 :(得分:2)

我不确定它会更有效率,但可以提供更好的代码......

系统提供了一些带有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

---- OBJ-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。

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