複数のクロージャ内で同期処理を行いたい場合のコーディング方法を教えて頂きたいです。
正解といったものは無いかと思いますが、iOSアプリを実装する上で一番使われている実装例を勉強したいです。
例えば以下のような処理Aと処理Bがあります。
同期処理として、処理Aのクロージャ実施後に処理Bのクロージャを実施する事を考えた場合、どのコーディングが多いのでしょうか。
- 処理Aのクロージャ内で処理Bを実施
- 処理Aのクロージャ内でセマフォウェイトで処理待ちし、処理Bのクロージャ内でセマフォシグナルで解除する。
- 処理Aのクロージャ内で処理Bに対してオブザーバ通知を送り、通知をトリガーに処理Bを実施
※(RxSwiftで実現できますでしょうか?すみません、実装実績がなく3.は推測で記載しています。)
swift
1// ■ 処理A 2func processA(){ 3 let Directions: MKDirections = MKDirections(request: request) 4 Directions.calculate { [weak self] (response, error) in 5 /* ~クロージャ内で処理~ */ 6 } 7} 8 9// ■ 処理B 10func processB(){ 11 let pedometer_ = CMPedometer() 12 pedometer_.queryPedometerData(from: fromDate, to: toDate) { [weak self] (data: CMPedometerData?, error) -> Void in 13 /* ~クロージャ内で処理~ */ 14 } 15} 16
恐れ入りますがご回答お願い致します。
ちなみに、その処理Aと処理Bの関係は? そのコードからだと無関係に見えますが?
処理A、処理Bのクロージャ内で取得した値をメインスレッド上で計算する処理をしています。メインスレッド上で計算するため、処理Aと処理Bの同期をとる必要がありました。
「処理Aのクロージャ実施後に処理Bのクロージャを実施する事を考えた場合」とありますが、クロージャの実行順序は関係ないということですか?
メインスレッド上での計算の記載は誤りでした。具体的にはこのような流れです。処理Aで値を取得 → 処理Bで値を取得 → 処理B内で処理Aの値と処理Bの値をつかって計算し、グローバル変数へセット。
つまり、処理Bが処理Aに依存しているという事でしょうか? 「1.処理Aのクロージャ内で処理Bを実施」とありますが、その場合、処理Bのクロージャ内で処理Aを実施することになると思いますが?
回答2件
あなたの回答
tips
プレビュー