【问题标题】:Ensuring that loop in async operation is completed before returning确保异步操作中的循环在返回之前完成
【发布时间】:2017-09-16 00:54:05
【问题描述】:

我的目标是异步执行一个资源繁重的操作,并确保它在返回对象之前完成。

这是结构:

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 项目。

我应该如何构建它以便在完成后能够退回项目?

谢谢。

【问题讨论】:

    标签: ios swift grand-central-dispatch


    【解决方案1】:

    您应该为此使用完成处理程序

    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)
    }
    

    【讨论】:

    • 您需要在完成处理程序上使用@escaping
    • 谢谢你们。这很有帮助
    【解决方案2】:

    如果操作是异步的,您将无法以这种方式返回值。您想要做的是将闭包作为完成处理程序:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2016-09-06
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多