gpt4 book ai didi

ios - 使用单个共享后台线程进行 iOS 数据处理?

转载 作者:可可西里 更新时间:2023-11-01 04:16:45 25 4
gpt4 key购买 nike

我有一个应用程序,我从网络上下载大量资源,并对每个资源进行一些处理。我不希望这项工作发生在主线程上,但它非常轻量级且优先级较低,因此所有这些工作都可以真正发生在同一个共享工作线程上。这似乎是一件好事,因为设置和拆除所有这些工作线程所需的工作(没有一个会存活很长时间,等等)。

但令人惊讶的是,似乎没有一种简单的方法可以在单个共享 线程上完成所有这些工作,而不是为每个任务生成一个新线程。多年来似乎出现了大量实现并发的途径,这使情况变得复杂。 (显式 NSThreadsNSOperationQueue、GCD 等)

我是否高估了生成所有这些线程所涉及的开销?我是否应该不费吹灰之力,而是使用更简单的任务线程方法?使用 GCD,并假设它在线程(重)使用方面比我更聪明?

最佳答案

使用 GCD — 这是当前的官方推荐,并且比任何其他解决方案都省力。如果您明确需要您传入的内容连续发生(即,就像在单个线程上一样),那么您可以实现这一点,但仅更改可能更聪明,例如

[self doCostlyTask];

收件人:

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 的线程池实现,他们同时引入了闭包(作为“ block ”)以使其可用。所以 ^(C-style args){code} 语法是一个 block /闭包。也就是说,它是代码加上代码引用的任何变量(受警告)的状态。您可以在没有 GCD 知识或使用的情况下自己存储和调用 block 。

dispatch_async 是一个 GCD 函数,向指定队列发出一个 block 。它在某个时间在某个线程上执行 block ,并应用未指定的内部规则以最佳方式执行此操作。它会根据诸如你有多少个内核、每个内核有多忙、它当前在节能方面的想法(可能取决于电源)、特定 CPU 的电源成本如何计算等因素来判断。

就程序员的发展而言, block 将代码变成可以作为参数传递的东西。 GCD 允许您请求根据操作系统可以管理的最佳调度来执行 block 。 block 的创建和复制非常轻量级——比例如NSOperations.

GCD 超越了上面示例中的基本异步调度(例如,您可以执行并行 for 循环并等待它在单个调用中完成)但除非您有特定需求,否则它可能不是那么相关。

关于ios - 使用单个共享后台线程进行 iOS 数据处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8125394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com