私のモデルには、イベントと呼ばれるオブジェクトの配列があります。新しいオブジェクトがイベントに追加されるたびに、コントローラーに通知したいと思います。
これを行う良い方法は、KVOパターンを使用して、イベントが変更されたときに通知を受けることだと思いました(新しいオブジェクトが追加されたことから)
// AppDelegate
// events is a NSMutableArray @property/@synthesize etc...
[appDelagate addObserver:self
forKeyPath:@"events"
options:NSKeyValueObservingOptionNew
context:NULL];
しかし、observeValueForKeyPathメソッドが呼び出されておらず、配列が KVO に準拠していないことがわかりました :-(
1 つのオプションは、keyPath の willChangeValueForKey を呼び出して、メソッドを手動でトリガーすることです。
// ViewController
[self willChangeValueForKey:@"events"];
[self.events addObject:event];
[self didChangeValueForKey:@"events"];
しかし、 observeValueForKeyPathメソッドからアクセスできるように、おそらくイベント配列の前後の状態も追跡する必要があるため、これは重く感じます。
1 つのアプローチとして、(変更可能ではなく) 標準配列を使用し、新しいオブジェクトを追加するたびにイベントの新しいインスタンスを作成/設定するか、オブジェクト内の項目数を追跡する別のプロパティを作成することができます。可変配列( @"events.count" を観察できればいいのに)。
別のオプションは、NSNotificationCenter を使用することです。ブロックの使用を提案するいくつかの回答も読みました(ただし、どこから始めればよいかわかりません)。
最後に、コントローラーのインスタンスをデリゲートに保持して、関連するメッセージを送信することはできますか?
// Delegate
[myController eventsDidChange];
デリゲートからコントローラーへの参照を保持するのは奇妙ですか?
どちらを使用するのが最善のアプローチなのかを理解するのに苦労しているので、パフォーマンス、将来のコードの柔軟性、およびベスト プラクティスに関するアドバイスをいただければ幸いです。