使用 GCD — 这是当前的官方建议,并且比任何其他解决方案都更省力。如果您明确需要传入的内容连续发生(即,就像在单个线程上一样),那么您可以实现这一点,但更改可能更明智,例如
[self doCostlyTask];
To:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^()
{
[self doCostlyTask];
dispatch_async(dispatch_get_main_queue(), ^()
{
// most UIKit tasks are permissible only from the main queue or thread,
// so if you want to update an UI as a result of the completed action,
// this is a safe way to proceed
[self costlyTaskIsFinished];
});
});
这本质上告诉操作系统“在最有效的地方以低优先级执行此代码”。您发布到任何全局队列的各种事物可能会也可能不会在彼此以及分派它们的线程的同一线程上执行,并且可能会也可能不会同时发生。操作系统应用它认为最佳的规则。
说明:
GCD是Apple对线程池的实现,他们同时引入了闭包(作为“块”)以使其可用。所以^(C-style args){code}
语法是块/闭包。也就是说,它是代码加上代码引用的任何变量的状态(根据注意事项)。您可以自己存储和调用块,无需 GCD 知识或使用。
dispatch_async
是一个 GCD 函数,向指定队列发出一个块。它有时会在某个线程上执行该块,并应用未指定的内部规则以最佳方式执行此操作。它将根据诸如您有多少个核心、每个核心的繁忙程度、当前对节能的考虑(这可能取决于电源)、特定 CPU 的电源成本如何计算等因素来进行判断。
因此,就程序员的发展而言,块将代码变成可以作为参数传递的东西。 GCD 允许您请求根据操作系统可以管理的最佳调度来执行块。块的创建和复制非常轻量——比例如块要轻得多。NSOperation
s.
GCD 超越了上面示例中的基本异步调度(例如,您可以执行并行 for 循环并等待它在单个调用中完成),但除非您有特定需求,否则它可能并不那么相关。