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

时间:2018-04-11 12:29:29

标签: ios swift swift4 grand-central-dispatch dispatch-queue

我如何一次执行上述所有目标以提高速度。

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[0]) 

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[1]) 

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[2]) 

self.passingMsgIdsTofetchMsgss(messageIDs : msgIDBatches[3])

2 个答案:

答案 0 :(得分:1)

你所追求的是DispatchQueue concurrentPerform上的课堂功能

例如:

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

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

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

答案 1 :(得分:0)

迅速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
            }
        }