Swift3 GCD的基本用法(二)
阿新 • • 發佈:2019-02-01
佇列的迴圈、掛起、恢復
// 迴圈 func dispatchApply() { DispatchQueue.global().async { DispatchQueue.concurrentPerform(iterations: 10, execute: { (index) in print("this is NO.\(index), thread=\(Thread.current)") }) DispatchQueue.main.async { print("Done") } } } // 掛起和恢復 func suspendAndResume() { // 先掛起顯示結果的任務 圖片下載完成後恢復 print("開始任務") let globalQueue = DispatchQueue(label: "ShowResult") globalQueue.suspend() globalQueue.async { print("圖片下載完成") } let concurrentQueue = DispatchQueue(label: "Concurrent", attributes: .concurrent) concurrentQueue.async { if let url = URL.init(string: "https://placebeard.it/800/800") { do { print("正在下載,請稍後...") _ = try Data(contentsOf: url) DispatchQueue.main.async { globalQueue.resume() } } catch { print(error) } } } }
GCD的其他方法
final class SingleTon: NSObject {
static let shared = SingleTon()
private override init() {}
func func1() {
print("單例中的 function")
}
}
注:final關鍵字的作用是這個類或方法不希望被繼承和重寫
// 只執行一次 func runOnce() { SingleTon.shared.func1() } // asyncAfter DispatchTime 延時執行 func delayDispatchTime() { print("開始執行\(NSDate())") // asyncAfter 並不是在指定時間後執行任務處理,而是在指定時間後把任務追加到queue裡面。因此會有少許延遲。注意,我們不能(直接)取消我們已經提交到 asyncAfter 裡的程式碼。 // dispatch_time用於計算相對時間,當裝置睡眠時,dispatch_time也就跟著睡眠了, let time: DispatchTimeInterval = .seconds(3) DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + time, execute: { print("相對延時3秒後執行\(NSDate())") }) } // asyncAfter DispatchWallTime 延時執行 func deplyDispatchWallTime() { print("開始執行\(NSDate())") let walltime = DispatchWallTime.now() + 3.0 //wallDeadline需要一個DispatchWallTime型別。建立DispatchWallTime型別,需要timespec的結構體。 DispatchQueue.global().asyncAfter(wallDeadline: walltime) { print("絕對延時3秒後執行\(NSDate())") } } // 任務組 func queueGroup() { let globalQueue = DispatchQueue.global() let group = DispatchGroup() globalQueue.async(group: group, execute: { print("執行任務1") }) globalQueue.async(group: group, execute: { print("執行任務2") }) globalQueue.async(group: group, execute: { print("執行任務3") }) globalQueue.async(group: group, execute: { print("執行任務4") }) group.notify(queue: globalQueue) { print("任務全部完成") } }
Swift3 GCD的基本用法(一) - 任務和佇列、服務優先順序、訊號量