我有一個程式可以列印一些系統資訊,如用戶串列、上次會話、藍牙狀態、wifi 狀態等。我想知道如何讓這個函式并行執行,一次運行所有命令。
我想使用 dispatchQueue,但我不知道如何在這段代碼中插入它
func runCommands() {
CommandFactory()
.makeCommands()
.forEach {command in
let group = DispatchGroup()
group.enter()
command.run {result in
print("---------\n\(command.identifier)\n\(result)")
group.leave()
print("---------")
}
group.wait()
}
print("Finished execution")
}
uj5u.com熱心網友回復:
您的實作很接近,但一次只能運行一個命令,因為您通過group.wait()在最后呼叫來阻止命令回圈的每次迭代。您要做的是group.notify(queue:)在回圈之后呼叫,以便DispatchGroup在所有命令完成時通知您。
我假設您有一個Command協議或您符合各種命令的協議。
protocol Command {
var identifier: String { get }
func run(competion: @escaping (Bool) -> Void)
}
以下將并行執行所有指定的命令:
class CommandQueue {
func runCommands(
_ commands: [Command],
completeOn queue: DispatchQueue = DispatchQueue(label: "queue.command.center"),
completion: @escaping () -> Void
) {
let group = DispatchGroup()
commands.forEach { command in
group.enter()
print("Command Start", command.identifier)
command.run { result in
print("Command End", command.identifier, result)
group.leave()
}
}
group.notify(queue: queue) {
completion()
}
}
}
這是用法:
let commandQueue = CommandQueue()
commandQueue.runCommands(CommandFactory().makeCommands(), completeOn: .main) {
print("Finished execution")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/450803.html
下一篇:JSON物件到字串SwiftUI
