簡體   English   中英

如何在 Swift 中暫停操作隊列

[英]How to pause operation queue in Swift

我有幾個操作要從 iOS 應用程序在 IoT 設備上執行。 所以我所有的操作都在帶有串行操作的 OperationsQueue 中。

在這里,我想一次執行一個操作,每個操作都需要等到我得到 IoT 設備的響應。

在這里,物聯網設備響應需要時間才能發回。 那么如何等待操作隊列中的當前操作,直到我得到物聯網的響應。

那么有什么方法可以暫停當前正在運行的操作,直到得到 IoT 的響應,然后我將恢復它,以便操作隊列中的下一個操作開始。

我嘗試了睡眠操作但它需要時間,但我們不能保證物聯網設備的響應。

任何建議將不勝感激。 先感謝您。

基本思想是您不要暫停(或等待,或睡眠),而是定義一個“並發”操作(請參閱文檔中對並發操作的討論),在設備響應之前不會觸發isFinished KVO。

一種簡單的方法是編寫一個並發操作 class,就像這個答案中顯示的那樣 然后,您的 IoT 操作可以繼承AsynchronousOperation class,並在設備響應時調用finish()

然后,您的操作隊列(它的maxConcurrentOperationCount可能為1 ,或者可能正在使用依賴項),直到前一個操作完成后才會開始操作。

正如Rob所說,您可以實現異步操作 class 並從中繼承您的IoT操作。 對我來說,這似乎是實現您的案例的最首選方式。

作為替代方案,如果您需要在另一個線程中的一些異步事件完成后繼續該過程,您可以使用NSCondition 這是來自 obj-c 的一種機制,它提供了一種簡單的方法來等待條件發生。

這是示例:


let cond = NSCondition()
var available = false
var sharedString = ""

class WriterThread: Thread {

    override func main() {
        for _ in 0..<5 {
            cond.lock()
            sharedString = "😅"
            available = true
            cond.signal() // Notify and wake up the waiting thread/s
            cond.unlock()
        }
    }
}

class PrinterThread: Thread {

    override func main(){
        for _ in 0..<5 { //Just do it 5 times
            cond.lock()
            while(!available) {   //Protect from spurious signals
                cond.wait()
            }
            print(SharedString)
            sharedString = ""
            available = false
            cond.unlock()
        }
    }
}

let writet = WriterThread()
let printt = PrinterThread()
printt.start()
writet.start()

您可以在發送操作時使用DispatchQueue並調用.suspend() ,並讓獲取響應的代碼調用.resume() 然后,無論您想在繼續之前等待響應,只需放置一個虛擬queue.sync({ print("done waiting")}) ,它就會自動等到.resume()在打印和繼續之前被調用。

import Dispatch
var queue = DispatchQueue(label: "queue")

func sendOperationToIoTDevice(){
    //send the operation
    //...
    queue.suspend()
}

...

//whatever code gets the response:
    //get response
    //...
    queue.resume()

...

//main code

sendOperationToIoTDevice()
queue.sync { print("done waiting") } // will hang here until .resume() is called

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM