多线程
1.串行
let serial = DispatchQueue(label: "serialQueue") serial.async { }
2.并行
let comQueue = DispatchQueue(label: "comQueue", attributes: DispatchQueue.Attributes.concurrent) comQueue.async { }
3.系统的线程
let queue = DispatchQueue.global(qos: .default) queue.async { } //主线 DispatchQueue.main.async { }
4.延时1秒执行
let time: TimeInterval = 1.0 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time) { //code print("1 秒后输出") }
5.group,用于多任务请求,最后刷新UI,注意:不是顺序执行的
private func test2() { let queue = DispatchQueue.global(qos: .default) let group = DispatchGroup() group.enter() queue.async(group: group, execute: { //网络请求 //注意:不过成功还是失败,读需要调用 group.leave() }) group.enter() queue.async(group: group, execute: { //网络请求 //注意:不过成功还是失败,读需要调用 group.leave() }) group.enter() queue.async(group: group, execute: { //网络请求 //注意:不过成功还是失败,读需要调用 group.leave() }) //最后结束的地方 group.notify(queue: DispatchQueue.main, execute: { //刷新UI }) }
6.信号,顺序执行
private func test3() { //获取系统存在的全局队列 let queue = DispatchQueue.global(qos: .default) //创建信号 let sem = DispatchSemaphore(value: 0) //请求1 queue.async { //网络请求 //注意:不过成功还是失败,读需要调用 sem.signal() } sem.wait() //请求2 queue.async { //网络请求 //注意:不过成功还是失败,读需要调用 sem.signal() } sem.wait() //请求3 queue.async { //网络请求 //注意:不过成功还是失败,读需要调用 sem.signal() } sem.wait() //最后结束的地方 DispatchQueue.main.async { //刷新UI } }