2017-08-31 10 views
1

それ自身が非同期操作を完了する関数を待つ方法はありますか?非同期操作の関数が終了するのを待つ

例を挙げましょう:

Function_Aは、ギャラリーから写真を取り出します。フェッチ操作は、フェッチクロージャを使用して非同期に実行されます。

Function_AFunction_Bに電話して、写真の取得操作が完了するのを待ってから、コードを続けてください。

私が試した何を:私はディスパッチグループを使用しましたが、それは働いていない

。私はまた、同期ブロックでFunction_Aに電話しようとしましたが、これも失敗しました。

どうすればこの操作が完了するのを待つことができますか?フェッチ操作を別のキューに実行しているためにこの問題が発生する可能性がありますか?

更新

これは私がやったことです:

class imageFetch: NSObject{ 
    var theImage: PHAsset? = nil 
    func Function_A(){ 
     let fetchOption = PHFetchOptions()   
     PHPhotoLibrary.requestAuthorization { (authStatus) in 
      // It seems code will be executed asynchronously from here 
      if authStatus == .authorized{ 
       let imageAsset = PHAsset.fetchAssets(with: .image, options: fetchOption) 
      // Select image and save it in theImage 
      // I know I can send a closure and run it here 
      } 
     } 
    } 
} 

、別のクラスで、私はその関数を呼び出す:コードなし

class edit: NSObject{ 
    funct Function_B(){ 
     var imageFetchIns = imageFetch() 
     // I want below code to execute asynchronously 
     imageFetchIns.Function_A() 

     // Now I want to wait last operation to finish 
    } 
} 
+0

約束のライブラリを調べましたか? – Malik

+2

dispatchgroupが機能しない理由がわかりません。コードを表示してみてください。 – zach274

+0

また、RxSwiftはタスクを簡単に解決します – iWheelBuy

答えて

1

が何であるかを理解することは非常に困難です行っている。 Using dispatch groups to wait for multiple web servicesを見ると、何が起こっているのかが分かります。

それ以外の場合は、NSOperationNSOperationQueueを使用して開始できます。実際、2つの操作がある場合は、それらの間に依存関係を追加できます。言い換えると、操作は、依存する操作が実行された後にのみ開始できると言うことができます。それに加えて、操作は取り消すことができる利点も有する。たとえば、ユーザーの操作に対処する場合に便利です。 NSOperation and NSOperationQueue Tutorial in Swiftは、それらの使用方法に関する非常に優れたイントロダクションを提供します。

私が操作を強調したいのは、操作(特にサブクラス化するとき)は、プロジェクト内や別のプロジェクト内でも再利用可能な自己完結型タスクを表すことです。

関連する問題