3

説明させてください。NSMutableArrayのインスタンスにすぎないデータクラスがあります。currentItemのプロパティを追加しました。アプリが起動すると、このクラスのインスタンスが作成され、複数のViewControllerと共有されます。

これらのビューコントローラーのいずれかが現在のアイテムを設定すると([myClass setCurrentItem:(MyItem *)item] UIなどを更新できるように、すべてのビューコントローラーに通知したい...

私は、ソリューションを実装するための最良の方法について対立しています。私は次のいずれかを行うことができます:

1.)カスタムプロトコルを使用し、メソッドaddDelegate:(id)instanceを追加してデリゲートのコレクションを追跡し、NSMutableArray ivarにデリゲートのコレクションを保持し、currentItemが設定されたときに反復して通信します。

また

2.)iVarが設定されている場合は、NSNotificationセンターを使用してこの通信を行います。

代表者が行く限り、電話の順番は私には関係ありません。

この状況に適したアプローチはどれですか?オプション#1の方がクリーンな方法のように思えますが、「複数の代理人」の検索結果では、複数の代理人がいる場合はNSNotificationセンターを使用する必要がありますが、その背後にある理由はあまりありません。

あなたの意見は何ですか、そしてその理由は何ですか?

4

1 に答える 1

1

上記のコメントはいくつかの考えを要約していると思いますが、私はいくつかの考えを追加したかっただけです。

これらのビューコントローラーのいずれかが現在のアイテムを設定すると([myClass setCurrentItem:(MyItem *)item] UIなどを更新できるように、すべてのビューコントローラーに通知したい...

これは、表示されていない場合でも、すべてのUIViewControllerを更新していることを意味します。開発しているプラ​​ットフォームについては明記していませんが、一般的には、コントローラーを絶対に必要な場合(つまり、ユーザーに表示されている場合)にのみ更新することを目指しています。この場合、ロジックを挿入したり、モデル(つまり、)をチェックしたり、ビューを適切に更新しviewWillAppear:たりするオプションがあります。viewDidAppear:NSMutableArray

さて、NSNotificationsを使用するか、プロトコルメソッドとデリゲートを使用するかという問題は難しい問題です。考慮すべきことがいくつかあると思います。

  1. クラスを所有または管理する単一のオブジェクトがありますか?一般的に、これは代理人に適しています-UITableViewたとえば、考えてみてください。
  2. 単一のオブジェクトがイベントにメソッドを実装する必要があることを確認しますか?プロトコルは、メソッドが実装されていることを確認し、ドキュメントを明確にすることができます。

それ以外の場合、通知は非常に便利です。標準のフレームワークを見て、それらからガイダンスを受け取りますが、それの多くは単なる判断の呼びかけであることに気づきます。UITextFieldたとえば、を見てくださいUITextFieldDelegate。プロトコルを使用しますが、通知も作成します。大きな理由があると思いますが、おそらくそれについて考えるのに少し時間を費やす必要があるでしょう...

編集:あなたが言及するように、完全を期すために:

2.)iVarが設定されている場合は、NSNotificationセンターを使用してこの通信を行います。

Key-Value Observing(KVO)を使用すると、オブジェクトインスタンス変数を使用して通知を直接登録できます。

iOS 5.1のドキュメントから:

Key-Value監視は、別のオブジェクトのプロパティが変更されたときにオブジェクトに直接通知できるようにするメカニズムです。Key-Valueの監視(またはKVO)は、アプリケーションのまとまりの重要な要素になる可能性があります。これは、Model-View-Controllerデザインパターンに準拠して設計されたアプリケーション内のオブジェクト間の通信モードです。たとえば、これを使用して、モデルオブジェクトの状態をビューおよびコントローラレイヤーのオブジェクトと同期させることができます。通常、コントローラーオブジェクトはモデルオブジェクトを監視し、ビューはコントローラーオブジェクトまたはモデルオブジェクトを監視します。

ドキュメントへのリンクを追加しますが、現時点ではブックマークを持っていません。

于 2012-07-24T10:31:16.130 に答える