【发布时间】:2025-12-10 16:50:01
【问题描述】:
我的目标是用 Swift 解析一个大的 XML 文件(20 GB)。 NSXMLParser 和桥接到 Swift 对象存在一些性能问题,所以我正在研究多线程。具体如下划分:
- 主线程 - 解析数据
- 工作线程 - 将 ObjC 类型转换为 Swift 类型并发送到 1。将 ObjC NSDictionary 转换为 [String: String] 是最大的瓶颈。这也是分离到多个线程的主要原因。
- 工作线程 - 将 XML 解析为 ObjC 类型 - 并发送到 2。NSXMLParser 是一个推送解析器,一旦开始解析,就无法暂停。
数据应按顺序解析,因此应保持输入顺序。我的想法是在 1 和 2 上运行 NSRunLoop,允许并行处理而不会阻塞。根据苹果的文档,线程之间的通信可以通过调用performSelector:onThread:withObject:waitUntilDone:来实现。但是这个符号在 Swift 中不可用。
我认为 GCD 不适合作为解决方案。两个工作线程都应该是长时间运行的进程,新工作会随机进入。
如何使用 Swift 实现上述目标(例如多线程上的 NSRunLoops)?
【问题讨论】:
标签: multithreading swift nsrunloop