2017-01-18 2 views
1

私は以下のシナリオを持っています:オブジェクトAは、ユーザーの選択に応じていくつかの操作を実行するオブジェクトBを作成します。 ABの代理人です。 Aは、ユーザーが行った選択(別のオブジェクトCによって表される)には参照を保持しませんが、Bを作成するメソッドでそれを認識しています。オブジェクトBがそのタスクを完了したときに、 Aが実装している対応するプロトコルメソッドを呼び出すことによってその旨を通知します。参照を保持している補完ハンドラVS:こ​​のシナリオにはSwiftで最も適していますか?

私がこのシナリオで考える最初の解決策は、選択肢Cの参照をAに入れ、終了時にBが呼び出すプロトコルメソッドの実装にアクセスすることです。しかし、Cを完了ハンドラを渡してAに参照を保持しないようにして、Bが終了するまで、より良い選択肢を処理することがよりスムーズになるかもしれません。

この2番目の解決策(完了ハンドラとしてクロージャをBに渡す)についてどう思いますか?それは最初の解決策(Aの参照を保持)よりも適切でしょうか?

このような場合、そのソリューションをどのように実装する必要がありますか? Bには完了ハンドラと呼ばれるクロージャの参照がありますか?

EDIT:私のシナリオのいくつかの追加情報:

  • Aが正確プロパティBを持っていない、それはナビゲーションコントローラにそれをプッシュします。
  • A常にに関するCB仕上げ、それはB
  • Aに要求されたタスクに依存する場合のみ、(前に言ったように、Bによって行われるタスクに応じて)についてCB一回を知っている必要がありますを知っている必要はありませんしました一部のデータの更新が完了しました。
  • A
  • のみ ABを所有している所有権の階層では、(前に言ったように、 Bによって行われるタスクに応じて)要するに一つだけ C一度

答えて

1

を知っている必要があり、両方のクラスはCを使用して、あなたがしたいですCAまたはBであるかどうかを知る必要があります。

  1. 両方AB自身C

    あなたは3つの基本的なオプションがあります。 AプロパティにCを節約することを意味する

は、初期化中Bに渡しとBもプロパティにCを保存します。

  1. ACです。 AがプロパティにCを保存し、全くBに渡していないことを意味

Bは、デリゲートメソッドを使用してそれを要求します(ABのデータソースとして機能します)。

  1. BCです。 Aを意味

Bは公共ゲッターを持つプロパティにそれを保存し、Cを必要Aとき、それはBからそれを読み、Bに直接C渡します。

(あなたの考えは3番目のオプションの変形です)。

3つのオプションのいずれも、速報とは関係がありません。これは純粋にアーキテクチャの選択であり、「最良の」解決策はありません。あなたが決めるにしたい場合は、アプリケーションの状態を考慮しなければならない、例えば:

  1. Bが破壊された後もAC存在するべきでしょうか?はいの場合は、3番目のオプションを使用しないでください。

  2. ABまたはCを複数同時に処理しますか?次に、2番目のオプションを使用しないでください。

  3. Cは変更可能か不変か。値かクラスの型ですか?値型の場合、最初のオプションは使用できません。

上記の3つのオプションはすべて問題ありません。アプリケーション全体で一貫性を保つと、コードの品質には影響しません。

EDIT:

第三のオプションが本当にあなたの状況に最もappropiateソリューションであるように私には思えます。しかし、私が前に言ったように、「最高の」解決策は一つもない。

+0

ありがとう。多分、私のシナリオについてさらに詳しく述べるべきです、私は私の質問を編集するつもりです。 – AppsDev

関連する問題