2017-05-24 48 views
0

例如,我有這樣的自定義操作:如何運行異步操作

class CustomOperation: Operation { 

    override init() { 
     super.init() 
     self.qualityOfService = .userInitiated 
    } 

    override func main() { 
     // .. 
    } 
} 

這是我在做什麼來運行CustomOperation

let customOperation = CustomOperation() 
customOperation.completionBlock = { print("custom operation finished") } 
customOperation.start() 

我有幾個CustomOperation小號試圖在同一時間運行。無論如何要運行它異步沒有爲每個CustomOperation創建OperationQueue?因爲isAsynchronous屬性是隻讀的。

+0

我建議你遠離'Operation'和'OperationQueue',並使用'Dispatch'庫來代替。它已經更新了Swift,因此它更好用,更易於使用,它更加靈活,而且它實際上是'Operation' /'OperationQueue'在內部使用的。你究竟想要完成什麼? – Alexander

+0

@Alexander我試圖從'UITableView'上顯示的數組中執行每個對象的任務。如果一個對象將顯示在'UITableViewCell'上,則操作開始。由於風格的原因,我使用'Operation'和'OperationQueue'。 – pableiros

+0

「風格的原因」? – Alexander

回答

1

您不必爲每個操作創建一個隊列。你可以把它們放在同一個隊列中。隊列的maxConcurrentOperationCount確定有多少個同時運行。

如果你根本不想使用隊列,你需要重寫start()和isAsynchronous()並讓start()啓動一個線程並運行。還有更多你需要比這做的(閱讀文檔)

https://developer.apple.com/reference/foundation/operation

轉到「方法來覆蓋部分」

如果要創建一個併發的操作,你需要重寫

  • 起動()
  • isAsynchronous
  • :至少下列方法和屬性
  • isExecuting
  • isFinished

在併發操作,您的start()方法是負責以異步方式開始操作。無論您是生成一個線程還是調用一個異步函數,都可以通過此方法來完成。在開始操作時,start()方法也應該更新isExecuting屬性所報告的操作的執行狀態。您可以通過發送關於isExecuting關鍵路徑的KVO通知來完成此操作,從而讓感興趣的客戶知道該操作正在運行。您的isExecuting屬性還必須以線程安全的方式提供狀態。