1,Swift繼續使用Object-C原有的一套線程,包括三種多線程編程技術:
(1)Thread
(2)Cocoa Operation(Operation和OperationQueue)
(3)Grand Central Dispath(GCD)
2,本文着重介紹Grand Central Dispath(GCD)html
//建立串行隊列 let serial = DispatchQueue(label: "serialQueue1") //建立並行隊列 let concurrent = DispatchQueue(label: "concurrentQueue1", attributes: .concurrent)
(2)獲取系統存在的全局隊列 編程
let globalQueue = DispatchQueue.global(qos: .default)
(3)運行在主線程的Main Dispatch Queue 數組
let mainQueue = DispatchQueue.main
4,添加任務到隊列的兩種方法 安全
DispatchQueue.global(qos: .default).async { //處理耗時操做的代碼塊... print("do work") //操做完成,調用主線程來刷新界面 DispatchQueue.main.async { print("main refresh") } }
(2)sync同步追加Block塊 多線程
//添加同步代碼塊到global隊列 //不會形成死鎖,但會一直等待代碼塊執行完畢 DispatchQueue.global(qos: .default).sync { print("sync1") } print("end1") //添加同步代碼塊到main隊列 //會引發死鎖 //由於在主線程裏面添加一個任務,由於是同步,因此要等添加的任務執行完畢後才能繼續走下去。可是新添加的任務排在 //隊列的末尾,要執行完成必須等前面的任務執行完成,由此又回到了第一步,程序卡死 DispatchQueue.main.sync { print("sync2") } print("end2")
5,暫停或者繼續隊列併發
//建立並行隊列 let conQueue = DispatchQueue(label: "concurrentQueue1", attributes: .concurrent) //暫停一個隊列 conQueue.suspend() //繼續隊列 conQueue.resume()
6,只執行一次異步
//往dispatch_get_global_queue隊列中添加代碼塊,只執行一次 var predicate:dispatch_once_t = 0 dispatch_once(&predicate, { () -> Void in //只執行一次,可用於建立單例 println("work") })
在Swift3中,dispatch_once被廢棄了,咱們要替換成其餘全局或者靜態變量和常量.async
private var once1:Void = { //只執行一次 print("once1") }() private lazy var once2:String = { //只執行一次,可用於建立單例 print("once2") return "once2" }()
7,asyncAfter 延遲調用函數
//延時2秒執行 DispatchQueue.global(qos: .default).asyncAfter(deadline: DispatchTime.now() + 2.0) { print("after!") }
若是須要取消正在等待執行的Block操做,咱們能夠先將這個Block封裝到DispatchWorkItem對象中,而後對其發送cancle,來取消一個正在等待執行的block。性能
//將要執行的操做封裝到DispatchWorkItem中 let task = DispatchWorkItem { print("after!") } //延時2秒執行 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2, execute: task) //取消任務 task.cancel()
8,多個任務所有結束後作一個所有結束的處理
//獲取系統存在的全局隊列 let queue = DispatchQueue.global(qos: .default) //定義一個group let group = DispatchGroup() //併發任務,順序執行 queue.async(group: group) { sleep(2) print("block1") } queue.async(group: group) { print("block2") } queue.async(group: group) { print("block3") } //1,全部任務執行結束彙總,不阻塞當前線程 group.notify(queue: .global(), execute: { print("group done") }) //2,永久等待,直到全部任務執行結束,中途不能取消,阻塞當前線程 group.wait() print("任務所有執行完成")
9,concurrentPerform 指定次數的Block最加到隊列中
//獲取系統存在的全局隊列 let queue = DispatchQueue.global(qos: .default) //定義一個異步步代碼塊 queue.async { //經過concurrentPerform,循環變量數組 DispatchQueue.concurrentPerform(iterations: 6) {(index) -> Void in print(index) } //執行完畢,主線程更新 DispatchQueue.main.async { print("done") } }
10,信號,信號量
//獲取系統存在的全局隊列 let queue = DispatchQueue.global(qos: .default) //當並行執行的任務更新數據時,會產生數據不同的狀況 for i in 1...10 { queue.async { print("\(i)") } } //使用信號量保證正確性 //建立一個初始計數值爲1的信號 let semaphore = DispatchSemaphore(value: 1) for i in 1...10 { queue.async { //永久等待,直到Dispatch Semaphore的計數值 >= 1 semaphore.wait() print("\(i)") //發信號,使原來的信號計數值+1 semaphore.signal() } }
原文出自:www.hangge.com 轉載請保留原文連接:http://www.hangge.com/blog/cache/detail_745.html