在前一篇提到了用 GCD 來增加執行緒(threads)以改進 App 的執行效能,本篇來聊 iOS 中另一種操作多執行緒的方法: Operation。
Operation 相比 GCD 而言,Operation 提供了更多對 thread 的操作,像是 dependency、observable、Pause、Cancel 及 Resume。
在使用 Operation 時,因 Operation 本身是 abstract class,要使用時除了繼承之外,也可以使用BlockOperation 來進行多工操作。
本篇的 demo 功能跟前一篇一樣,只不過多了一個停止的按鈕。接下來就用此 demo 來介紹 Operation 的功能。
首先先初始化用來存放 Operations 的 Queue:
var queue = OperationQueue()
接下來初始化要放入 Queue 中的 Operation,並將之加入到之前宣告好的 Queue 中。在此 demo 中每個 Operation 要做的事情跟前一篇一樣是透過網路下載圖片:
let operation2 = BlockOperation(block: {
let img2 = self.downloadImageWithURL(url: self.imageURLs[1])
})
queue.addOperation(operation2)
開頭介紹時有提到 Operation 相比 GCD 提供了更多的功能,其中之一就是相依性(dependency)。若想讓某兩個 Operation 有相依性,其方法如下:
operation2.addDependency(operation1)
加了 dependency 之後,operation2 會等到 operation1 結束之後才會執行。
Cancel Operation 的方式也很簡單,可單獨取消個別 Operation,也可以一次取消全部。
queue.cancelAllOperations()
or
operation1.cancel()
在更新 UIKit compoments 時亦跟 GCD 一樣需回到 main thread 才能進行更新:
let operation2 = BlockOperation(block: {
...
OperationQueue.main.addOperation(
self.imageView2.image = img2
})
})
...
Reference:
Source code on Github