在继续下一个任务之前等待任务完成

时间:2017-03-27 15:43:03

标签: ios swift

我使用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()

但是,这似乎没有正常工作,因为所有命令仍然同时运行。基本上我需要上面的每个块运行,然后等到完成后再移动到下一个块。

2 个答案:

答案 0 :(得分:0)

NMSSH 框架遵循(非常!)公共委托模式(例如,来自{{UIText​Field​视图及其UIText​Field​Delegate协议1}}框架;等等)。因此,所有网络操作都在后台运行,并在完成后, fire 相应的协议方法。

您应该实施UIKitNMSSHSessionDelegate协议以获得此类事件的通知。请记住,这样做时代码结构会有很大差异。

希望有所帮助; - )

答案 1 :(得分:0)

好的,首先使用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您会收到通知当工作完成并让队列继续。