确保异步操作中的循环在返回之前完成
Ensuring that loop in async operation is completed before returning
我的目标是异步执行资源密集型操作,并确保它在 returning 对象之前完成。
这是结构:
func modifyGadgets() -> [Gadget] {
var gadgetsToModify = [Gadget]() //this is already populated elsewhere
DispatchQueue.global(qos: .userInitiated).async {
//Do something to the original gadgets
for gadget in gadgetsToModify {
modifyThisGadget(gadget)
}
DispatchQueue.main.async {
return gadgetsToModify //I get a warning here saying gadgetsToModify is unused
}
}
}
除了警告之外,我也没有取回任何 Gadget
项。
我应该如何构建它以便在完成后能够return这些项目?
谢谢。
您应该为此使用完成处理程序。
func modifyGadgets(_ callback: @escaping ([Gadget]) -> ()) {
var gadgetsToModify = [Gadget]()
DispatchQueue.global(qos: .userInitiated).async {
for gadget in gadgetsToModify {
modifyThisGadget(gadget)
}
DispatchQueue.main.async {
callback(gadgetsToModify)
}
}
}
你可以这样使用它:
modifyGadgets { gadgets in
print(gadgets)
}
如果操作是异步的,您将无法 return 通过这种方式获取值。您要做的是将闭包作为完成处理程序:
func modifyGadgets(completionHandler: @escaping ([Gadget]) -> ()) {
let gadgets = ...
DispatchQueue.global(qos: .userInitiated).async {
//Do something to the original gadgets
for eachGadget in gadgets {
modifyThisGadget(eachGadget)
}
completionHandler(gadgets)
}
}
那么你可以这样称呼它:
modifyGadgets { gadgets in
// do something with gadgets
}
我的目标是异步执行资源密集型操作,并确保它在 returning 对象之前完成。
这是结构:
func modifyGadgets() -> [Gadget] {
var gadgetsToModify = [Gadget]() //this is already populated elsewhere
DispatchQueue.global(qos: .userInitiated).async {
//Do something to the original gadgets
for gadget in gadgetsToModify {
modifyThisGadget(gadget)
}
DispatchQueue.main.async {
return gadgetsToModify //I get a warning here saying gadgetsToModify is unused
}
}
}
除了警告之外,我也没有取回任何 Gadget
项。
我应该如何构建它以便在完成后能够return这些项目?
谢谢。
您应该为此使用完成处理程序。
func modifyGadgets(_ callback: @escaping ([Gadget]) -> ()) {
var gadgetsToModify = [Gadget]()
DispatchQueue.global(qos: .userInitiated).async {
for gadget in gadgetsToModify {
modifyThisGadget(gadget)
}
DispatchQueue.main.async {
callback(gadgetsToModify)
}
}
}
你可以这样使用它:
modifyGadgets { gadgets in
print(gadgets)
}
如果操作是异步的,您将无法 return 通过这种方式获取值。您要做的是将闭包作为完成处理程序:
func modifyGadgets(completionHandler: @escaping ([Gadget]) -> ()) {
let gadgets = ...
DispatchQueue.global(qos: .userInitiated).async {
//Do something to the original gadgets
for eachGadget in gadgets {
modifyThisGadget(eachGadget)
}
completionHandler(gadgets)
}
}
那么你可以这样称呼它:
modifyGadgets { gadgets in
// do something with gadgets
}