确保异步操作中的循环在返回之前完成

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
}