1. 程式人生 > >Swift3 GCD的基本用法(二)

Swift3 GCD的基本用法(二)

佇列的迴圈、掛起、恢復

// 迴圈
    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的基本用法(一) - 任務和佇列、服務優先順序、訊號量