在 iOS swift 中异步/并发/并行运行任务

Posted

技术标签:

【中文标题】在 iOS swift 中异步/并发/并行运行任务【英文标题】:Run tasks asynchronously/concurrently/parallally in iOS swift 【发布时间】:2018-04-11 12:29:29 【问题描述】:

我怎样才能一次执行所有上述任务以提高速度。

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[0]) 

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[1]) 

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[2]) 

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[3])

【问题讨论】:

发布getFullMail方法的内容 您是从网络获取数据吗?如果是这样,您在应用中执行的任何操作都不太可能提高性能 我建议在 for 循环中打印线程 ID 以验证您是否正在获得并发执行。调整什么可能取决于答案。 【参考方案1】:

你所追求的是 DispatchQueue concurrentPerform 上的类函数

例如:

DispatchQueue.concurrentPerform(iterations: msgIDBatches.count)  (index) in
    self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[index])    

如果您要更新 UI,显然需要小心回调主队列,并确保 passingMsgIdsTofetchMsgss 是线程安全的。还值得使用time profiler 进行检查,这实际上是性能瓶颈所在。

另一个选项是OperationQueue,您可以将所有提取添加到队列并同时执行它们。

【讨论】:

【参考方案2】:

斯威夫特 4.1。首先创建一个并发队列

private let concurrentPhotoQueue = DispatchQueue(label: "App_Name", attributes: .concurrent)

现在将您的工作分派到并发队列

concurrentPhotoQueue.async(flags: .barrier)  [weak self] in
            // 1
            guard let weakSelf = self else 
                return
            
            // 2 Perform your task here
            weakSelf.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[0])
            weakSelf.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[1])
            weakSelf.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[2])
            weakSelf.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[3])
            // 3
            DispatchQueue.main.async  [weak self] in
                // Update your UI here
            
        

【讨论】:

以上是关于在 iOS swift 中异步/并发/并行运行任务的主要内容,如果未能解决你的问题,请参考以下文章

python 同步异步,并发并行,同步锁

python-并发并行同步异步同步锁

复习打卡--0821多线程并发

并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁

iOS(Swift) TaskProtocol异步任务队列

Python之并发并行阻塞非租塞同步异步IO多路复用