【问题标题】:Inter-thread communication in Swift?Swift 中的线程间通信?
【发布时间】:2025-12-10 16:50:01
【问题描述】:

我的目标是用 Swift 解析一个大的 XML 文件(20 GB)。 NSXMLParser 和桥接到 Swift 对象存在一些性能问题,所以我正在研究多线程。具体如下划分:

  1. 主线程 - 解析数据
  2. 工作线程 - 将 ObjC 类型转换为 Swift 类型并发送到 1。将 ObjC NSDictionary 转换为 [String: String] 是最大的瓶颈。这也是分离到多个线程的主要原因。
  3. 工作线程 - 将 XML 解析为 ObjC 类型 - 并发送到 2。NSXMLParser 是一个推送解析器,一旦开始解析,就无法暂停。

数据应按顺序解析,因此应保持输入顺序。我的想法是在 1 和 2 上运行 NSRunLoop,允许并行处理而不会阻塞。根据苹果的文档,线程之间的通信可以通过调用performSelector:onThread:withObject:waitUntilDone:来实现。但是这个符号在 Swift 中不可用。

我认为 GCD 不适合作为解决方案。两个工作线程都应该是长时间运行的进程,新工作会随机进入。

如何使用 Swift 实现上述目标(例如多线程上的 NSRunLoops)?

【问题讨论】:

    标签: multithreading swift nsrunloop


    【解决方案1】:

    我上个月第一次使用NSOperation,它是一个非常容易子类化的对象,您可以将它们与完成块链接在一起,或者您可以将操作设置为彼此的依赖关系,以便它们'按顺序重新执行。

    通过向 NSOperations 传递对象来与它们进行通信也很容易。

    NSHipster:http://nshipster.com/nsoperation/

    【讨论】: