簡體   English   中英

在繼續下一個任務之前等待任務完成

[英]Waiting for a task to finish before moving on to next one

我正在使用NMSSH連接到服務器,然后從該服務器上獲取數據。 但是,連接到服務器,執行命令和檢索數據都需要一些時間來完成。 以前,我使用sleep()命令以允許程序暫停並讓這些命令完成運行但如果我沒有指定准確的睡眠時間,則數據可能無法完全完成下載(因為數據在大小很難確定正確的睡眠量)。 因此,在進行一些研究后,似乎Dispatch Groups和Async操作是正確的方法。 我實現了如下:

let queue = DispatchQueue(label: "myqueue")
let group = DispatchGroup()    
let myfirstconnection: SSH = SSH()
myfirstconnection.hostname = "@hostname"
myfirstconnection.username = "user"
myfirstconnection.password = "password"

queue.async(group: group) {
    myfirstconnection.connectToServer()
    print("1")
}
group.wait()

queue.async(group: group) {
    myfirstconnection.performCommand()
    print("2")
}
group.wait()

queue.async(group: group) {
    myfirstconnection.retrieveData()
    print("3")
}
group.wait()

queue.async(group: group) {
    myfirstconnection.endSession()
    print("4")
}
group.wait()

但是,這似乎沒有正常工作,因為所有命令仍然在同一時間運行。 基本上我需要上面的每個塊運行,然后等到完成后再移動到下一個塊。

所述NMSSH框架遵循(非常!)共同委托模式 (例如, UIText​Field​視圖及其UIText​Field​Delegate從協議UIKit框架;等)。 因此,所有網絡操作都在后台運行,並在完成后啟動相應的協議方法。

您應該實現NMSSHSessionDelegateNMSSHChannelDelegate協議以通知此類事件。 請記住,這樣做時代碼結構會有很大差異。

希望有所幫助;-)

好吧,首先使用sleep()根本不起作用,因為你想要估計下載內容的時間,某些連接可能很快,有些可能會很慢。 從我對你的問題的理解,你想要執行一些任務,然后對數據做一些事情,然后繼續下一個任務,直到它們完成。一次一個項目。 對於這種情況,我有一個解決方案,但我不確定這是否是最好的方式,但它的工作原理。

        let serialQueue = DispatchQueue(label: "serialQueueWork" )
        let semaphore = DispatchSemaphore(value: 1)

        let task1 = DispatchWorkItem {
            semaphore.wait()
            print("1 started.")
            for _ in 0...5{
                print("♥️")
            }
        }

        let task2 = DispatchWorkItem  {
            semaphore.wait()
            print("2 started.")
            for _ in 0...5{
                print("♣️")
            }
        }

        task1.notify(queue: DispatchQueue.main) {
            print("1 is finished.")
            semaphore.signal()
        }

        task2.notify(queue: DispatchQueue.main) {
            print("2 is finished")
            semaphore.signal()
        }

        serialQueue.async(execute: task1 )
        serialQueue.async(execute: task2 )


// console result

1開始了。 ♥️♥️♥♥♥♥️♥️1完成了。 2開始了。 ♣️♣️♣️♣️♣️♣️2完成

使用semaphore可以控制隊列何時可以繼續工作。 使用DispatchWorkItem會收到通知當工作完成並讓隊列繼續。

暫無
暫無

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

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