多線程可以說ios進(jìn)階高級程序員的必修課,swift2的時候GCD還是繼承的OC中多線程的C API韵吨,在swift3之后為了適用swift的開發(fā)模式归粉,所以對GCD進(jìn)行了更改漏峰,詳情可以參考Modernize libdispatch for Swift 3 naming conventions
本文主要介紹swift3.0下的多線程更改及使用,廢話不多說倔喂,進(jìn)入正題靖苇!
先看一下具體轉(zhuǎn)換
** C type** | ** Swift type ** |
---|---|
dispatch_object_t | DispatchObject |
dispatch_queue_t | DispatchQueue |
dispatch_group_t | DispatchGroup |
dispatch_data_t | DispatchData |
dispatch_io_t | DispatchIO |
dispatch_semaphore_t | DispatchSemaphore |
dispatch_source_t | DispatchSource |
dispatch_time_t | DispatchTime, DispatchWalltime |
** 初始化幾個對象悼枢,方便下文中使用 **
/// 創(chuàng)建隊列
let queue = DispatchQueue.init(label: "com.test.myqueue")
/// 創(chuàng)建時間
let queueTime = DispatchTime.init(uptimeNanoseconds: UInt64.init(1))
/// 創(chuàng)建線程組
let groupQueue = DispatchGroup.init()
swift3中引入了DispatchWorkItem, 從名字差不多可以猜出來脾拆,這就是一個閉包,其內(nèi)部還有幾個方法
let item = DispatchWorkItem.init {
print("Hello World")
}
/// 等待
item.wait()
/// 取消
item.cancel()
/// 通知某個隊列干活双揪,使用這個方法時會使在queue隊列中的item失效
item.notify(queue: queue) {
print("該干活了!")
}
正式開始运吓!
1.DispatchQueue
- 在swift2之前開辟一個異步線程是這樣的
dispatch_async(queue) {
print("Hello World")
}
swift3中已經(jīng)正式棄用了拘哨!
現(xiàn)在我們要這樣用
queue.async(execute: {
print("Hello World")
})
- 開辟同步線程
queue.sync {
print("Hello World")
}
- 合起來
DispatchQueue.init(label: "com.test.myqueue").async {
print("Hello World")
}
- 延時操作
/// 使用閉包或者DispatchWorkItem
queue.asyncAfter(deadline: queueTime) {
print("Hello world")
}
queue.asyncAfter(deadline: queueTime, execute: item)
等會,突然發(fā)現(xiàn)這個方法和我想的怎么不一樣呢瓮床,233333,怎么辦呀踢步!
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: {
print("1s 后的世界")
})
2.DispatchGroup
group的使用方法與OC中幾乎完全相同丑掺,下面一一來看一下:
- 將一個隊列加入到gorup中
queue.async(group: groupQueue, execute: item)
或者
groupQueue.enter()
queue.async {
/// do what you want then leave
groupQueue.leave()
}
- 通知主線程刷新界面
groupQueue.notify(queue: DispatchQueue.main) {
/// 異步工作完成街州,可以放到主線程刷新UI了
}
總結(jié)
總體而言,OC中的cocoa部分在swift中差不多都有對應(yīng)的方法唆缴,在GCD中也是同樣的,但swift中對其進(jìn)行了進(jìn)一步優(yōu)化艳丛,所以使用起來會感覺更加優(yōu)雅斗忌,本文只是簡單介紹了一下gcd的常用方法织阳,在實(shí)際項目中往往要復(fù)雜的多,各位可以根據(jù)實(shí)際情況進(jìn)行使用GCD造挽,共勉弄痹!
** 如果覺的本文有用的話,可以順手點(diǎn)個喜歡谐丢!如有疑問乾忱,可以在下方留言历极! **