2017-09-15 1 views
0

私の目標は、リソースの重い操作を非同期的に実行し、オブジェクトが返される前に完了していることを確認することです。返す前に非同期操作のループが完了していることを確認する

これは構造体である:警告に加えて

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項目のいずれかを得ることはありません。

これをどのように構造化して、アイテムを完成したら返品することができますか?

ありがとうございました。

答えて

3

完了ハンドラを使用してください。操作は非同期です

modifyGadgets { gadgets in 
    print(gadgets) 
} 
+1

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

次に、あなたがこのようにそれを呼び出すことができます。 –

+0

ありがとうございます。これは非常に便利です – daspianist

2

場合は、この方法で値を返すことはできません。

func modifyGadgets(_ callback: @escaping ([Gadget]) ->()) { 
    var gadgetsToModify = [Gadget]() 

    DispatchQueue.global(qos: .userInitiated).async { 
     for gadget in gadgetsToModify { 
      modifyThisGadget(gadget) 
     } 

     DispatchQueue.main.async { 
      callback(gadgetsToModify) 
     } 
    } 
} 

は、あなたはそれをこのように使用することができます。あなたが代わりにやりたいことは完了ハンドラとして閉鎖を取ることです:あなたは `完了ハンドラ上の@ escaping`が必要

modifyGadgets { gadgets in 
    // do something with gadgets 
} 
関連する問題