iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 30
0

在前一篇提到了用 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
  })
})
...

在開始執行此 demo 後馬上取消會發現只會出現圖一跟圖四,其原因是在圖三會等圖二,圖二會等圖一,而處理圖四的 Operation 沒有增加相依性。

Reference:
Source code on Github


上一篇
Multi-Thread handling - GCD(Grand Central Dispatch)
系列文
30天Swift入門學習30

尚未有邦友留言

立即登入留言