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

2024-05-03

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

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

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


使用 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 允许您请求根据操作系统可以管理的最佳调度来执行块。块的创建和复制非常轻量——比例如块要轻得多。NSOperations.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用单个共享后台线程进行 iOS 数据处理? 的相关文章

随机推荐

  • 返回 Tkinter Treeview iid

    我有一个树视图 并在其中插入了一些数据 如下所示 self tree insert end iid test1 text test a values data1 data2 这将在树视图的末尾添加一个条目 其中包含文本 test a 以及列
  • 如何在kafka消费组中动态添加消费者

    我应该如何知道何时必须扩展消费者组中的消费者 当存在快速生产者时 消费者扩大规模的触发因素是什么 一种直接的方法是获取消费者延迟 这可以计算为提交的偏移量和开始偏移量之间的差值 如果最后 n 次计算的延迟正在增加 您可以扩大规模 反之亦然
  • 在 Objective-C 中选择性加载类

    我有模块 但没有来自两个不同的人的源代码 它们都包含相同的类 有没有办法有选择地从模块中加载类 以便重复的类不会发生冲突 是的 我知道这个替代解决方案建议加载和卸载 并且宁愿通过有选择地加载类并完成它来完成 解决 Objective C 命
  • C# 如何使用反射调用字段初始值设定项?

    假设我有这个 C 课程 public class MyClass int a int b new int 6 现在假设我使用反射发现了这个类 并且在查看字段时我发现其中一个是数组类型 即 b foreach FieldInfo fieldi
  • Spark JDBC 仅返回带有列名的数据帧

    我正在尝试使用 Spark JDBC 连接到 HiveTable 代码如下 val df spark read format jdbc option driver org apache hive jdbc HiveDriver option
  • Grafana/prometheus 中没有 kafka 指标

    我成功部署了 Helm Chart普罗米修斯操作员 https github com coreos prometheus operator tree master helm prometheus operator kube 普罗米修斯 ht
  • 在 Beyond Compare 中比较 Json 文件

    如何在 Beyond Compare 中比较两个缩小的 json 文件 是否有内置的 json 文件格式 我正在寻找比较底层 json 对象的两个漂亮的打印表示 In 这个线程 https www scootersoftware com v
  • 使用 pandas 进行操作SettingWithCopyWarning

    我试着delete某些列并转换列中的某些值 df2 drop df2 columns 0 1 3 axis 1 inplace True df2 date df2 date map lambda x str x 1 df2 date df2
  • Git:设置仅获取远程?

    当我跑步时git remote v在我配置了远程的 Git 存储库之一中 我看到每个远程都具有获取和推送规范 git remote v
  • 将 lambda 函数应用于 pandas 滚动窗口系列

    我有一个函数 它接受一个数组和一个值 并返回一个值 我想将其应用到我的系列中s在滚动的基础上 所以数组始终是滚动 窗口 这是我尝试过 不成功 的一个最小示例 使用np random choice代替我真正的功能 我找到了很多查找滚动均值和其
  • 从 bazaar 转换为 git 并同步它们的正确方法

    我在 bazaar 中有一个开发存储库 我想将其转换为 git 并保持同步 我需要这个 因为我将与不了解 bazaar 的人分享我的代码 首先我需要将我的 bazaar 存储库转换为 git 我用谷歌搜索了一下 发现this http as
  • jersey.api.client.WebResource - 如何调试/记录请求标头

    我正在使用 jersey 生成 http 请求 我希望能够看到request在发送之前 用于调试目的 例如 WebResource resource client resource url resource header aa bb res
  • 如何使用MonkeyDevice.instrument?

    嗨 大家好 我正在尝试从 MonkeyRunner 脚本运行我的测试仪器之一 不幸的是我无法让它工作 我尝试使用不同的参数变量调用 MonkeyDevice instrument 但没有成功 我试过了 设备 MonkeyRunner wai
  • 与 EOF 比较时使用 int 作为字符类型

    引自 Kernighan 和 Ritchie 的 C 编程语言 第 16 页 include
  • 使用 Selenium 自动化结帐流程时出现 403

    我正在尝试使用 python 和 selenium 创建一个脚本来自动执行 bestbuy ca 的结帐过程 我一直到达最后阶段 您可以单击以查看最终订单 但当我尝试单击到最后一步时 收到以下 403 禁止消息 如网络响应中所示 是否有服务
  • 当目录中同时添加很多文件时FileSystemWatcher无法正常工作

    当许多文件同时添加到目录中时 FileSystemWatcher 无法正常工作 观察者根本找不到目录中的所有文件 仅当文件被一一放置在文件夹中时 如果大量文件同时复制到文件夹中则不会 线程的创建是问题的解决方案还是有其他方法来处理问题 Th
  • 分割如何提高埃拉托斯特尼筛法的运行时间?

    我遇到了埃拉托色尼筛的分段实现 它的运行速度比传统版本快很多倍 有人可以解释一下分段如何提高运行时间吗 请注意 我想在其中找到素数 1 b 它适用于这个想法 用于查找 10 9 之前的质数 我们首先生成 sqrt 10 9 以下的筛选素数
  • 如何使用 iText 将 HTML 转换为 PDF [重复]

    这个问题在这里已经有答案了 import java io File import java io FileOutputStream import java io OutputStream import com itextpdf text D
  • 如何在两个或多个 Servlet 之间共享变量或对象?

    我想知道是否有某种方法可以在两个或多个 Servlet 之间共享变量或对象 我的意思是某种 标准 方法 我认为这不是一个好的做法 但却是构建原型的更简单的方法 我不知道这是否取决于所使用的技术 但我会使用 Tomcat 5 5 我想共享一个
  • 使用单个共享后台线程进行 iOS 数据处理?

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