1

2番目のメソッドは、最初のメソッドが完了した後にのみ呼び出されるように非同期呼び出しを行う必要があります。どちらのメソッドもネットワークコールです。このようなもの:非同期swift 3

signIn() 
getContacts() 

私は、signInが完了した後でgetContactsが呼び出されることを確認します。 FWIW、Google SDKからのものであるため、メソッドシグネチャを編集できません。

これは私が試したものです:あなたはNSOperationを探している

let queue = DispatchQueue(label: "com.app.queue") 

queue.async { 
signIn() 
getContacts() 

} 
+1

Fine。実際の質問は何でしたか? – JeremyP

+0

通常、 'signIn'のようなメソッドは、' signIn(){getContacts()} 'のように、メソッドの終了後に呼び出されるクロージャーで渡されますが、このためにメソッドをリエンジニアリングする必要があります。 – Robert

答えて

1

非同期呼び出しは、性質上、完了まで実行されず、次のものを呼び出します。彼らは完了するように依頼されたタスクが予定される前にすぐに復帰します。

2番目のタスクを最初に完了するまで待つ方法が必要です。

NauralInOvaは1つの良い解決策を出しました:NSOprationsのペアを使用し、それらをお互いに依存させます。 2つの操作をシリアルキューに入れることもでき、2つ目の操作は最初の操作が完了するまで開始しません。これらの呼び出しが別のスレッドで非同期操作をトリガーする場合

しかし、彼らはまだ返すことがあり、動作キューが完了するのsignIn()のを待つことなく、第2の動作(getContacts()コールをトリガすることができる。

別のオプションを設定することですコールバックを取るための第一の機能アップ:

signIn(callback: { 
    getContacts() 
} 

番目のオプションは、デリゲートを取るログインオブジェクトを設計することで、サインインが完了すると、ログインオブジェクトがデリゲートにsignInCompleteメソッドを呼び出します

これは一般的なことですが、ほとんどのネットワーキングAPIは「すぐに使える」ように構築されています.Google APIにこれを処理するための機能がないと驚いています。

どのGoogleのフレームワークを使用していますか?あなたはそれのためのドキュメントを指すことができますか?

+0

あなたは絶対に正しいです、私はそれを見逃したか分かりません。彼らは、サインインが完了した後に呼び出されるdidSignInメソッドを持っていました。私はちょうどそこにgetContactsメソッドを置く必要があったし、うまくいきました。あなたの助けに感謝します。 –

1

。 NSOperationを使用すると、依存関係を使用して操作を連鎖させることができます。 1つの操作が完了すると、完了ブロックを次の操作に渡すことができます。ご利用の場合の例は次のようになります。

// AuthOperation is a subclass of NSOperation 
let signInOperation = AuthOperation() 
// ContactsOperation is a subclass of NSOperation 
let getContactsOperation = ContactsOperation() 

getContactsOperation.addDependency(signInOperation) 

Ray WenderlichはNSOperationをカバーする偉大なチュートリアルがあります。このチュートリアルでは、ダウンロード操作を使用して、ネットワーク要求の完了時に写真をフィルタする依存関係と非同期に画像をロードします。

アップルは、非同期ネットワーク要求の操作を使用する偉大なsample projectもあります。

+0

おかげでそれは良い読書でした。私の必要なものではなく、おそらく私の実際の質問に対する最善の答え。 –

関連する問題