Swift iOS:已掌握队列创建与单任务执行,如何并行执行多任务?
在Swift iOS中用队列并行执行多个任务
嘿,既然你已经搞定了队列创建和单任务执行的方法,那实现多任务并行其实非常直接——核心就是利用并发队列的特性,往里面提交多个异步任务就行。咱们结合你给出的队列示例,具体看看怎么操作:
一、自定义并发队列执行并行任务
你定义的concurrentQueue本身就是并发队列,只要多次调用async方法提交任务,这些任务就会被系统调度并行执行:
let concurrentQueue = DispatchQueue(label: "com.some.concurrentQueue", attributes: .concurrent) // 提交第一个并行任务 concurrentQueue.async { print("任务1开始执行") // 模拟耗时操作,比如网络请求或数据处理 Thread.sleep(forTimeInterval: 2) print("任务1执行完成") } // 提交第二个并行任务 concurrentQueue.async { print("任务2开始执行") Thread.sleep(forTimeInterval: 1) print("任务2执行完成") } // 提交第三个并行任务 concurrentQueue.async { print("任务3开始执行") Thread.sleep(forTimeInterval: 3) print("任务3执行完成") }
运行这段代码你会发现,三个任务几乎同时启动,不会互相等待,最终完成顺序取决于各自的耗时(比如任务2会先完成,然后是任务1,最后是任务3)。
二、全局后台队列执行并行任务
全局队列不管是默认优先级还是指定QoS的,本质都是并发队列,用法和自定义并发队列完全一致:
无优先级默认后台队列
// 提交多个并行任务到默认全局队列 DispatchQueue.global().async { print("全局队列任务A开始") Thread.sleep(forTimeInterval: 2) print("全局队列任务A完成") } DispatchQueue.global().async { print("全局队列任务B开始") Thread.sleep(forTimeInterval: 1) print("全局队列任务B完成") }
带优先级的后台队列
指定QoS(服务质量)只是告诉系统任务的优先级,不影响并行特性,比如用userInitiated优先级:
let highPriorityQueue = DispatchQueue.global(qos: .userInitiated) highPriorityQueue.async { print("高优先级任务X开始") Thread.sleep(forTimeInterval: 2) print("高优先级任务X完成") } highPriorityQueue.async { print("高优先级任务Y开始") Thread.sleep(forTimeInterval: 1) print("高优先级任务Y完成") }
三、实用技巧:等待所有并行任务完成
如果需要在所有并行任务都结束后执行某些操作(比如更新UI),可以用DispatchGroup来实现:
let concurrentQueue = DispatchQueue(label: "com.some.concurrentQueue", attributes: .concurrent) let taskGroup = DispatchGroup() // 提交任务时加入分组 concurrentQueue.async(group: taskGroup) { print("分组任务1执行") Thread.sleep(forTimeInterval: 2) } concurrentQueue.async(group: taskGroup) { print("分组任务2执行") Thread.sleep(forTimeInterval: 1) } // 等待所有分组任务完成后执行回调 taskGroup.notify(queue: DispatchQueue.main) { print("所有并行任务都完成了!现在可以更新UI啦") }
这里的notify方法会在所有任务结束后,切换到指定队列(比如主队列)执行后续操作,非常适合处理并行任务后的收尾工作。
内容的提问来源于stack exchange,提问作者user9364391
相关产品推荐
相关产品推荐

