潜在的に多くのキー値パスを監視するのではなく、何かが変更されたときに配列内の各オブジェクトに通知を投稿させないでください。1 つのオブジェクトが多くのキー値パスを監視するのではなく、1 つのオブジェクトだけが 1 つの通知を監視する必要があります。
編集:
また、配列されたオブジェクトは、+keyPathsForValuesAffecting<key>
where <key>
is your key name というクラス メソッドに応答することもできます。以下に例を示します:paymentDue
は値invoiceItems.count
またはpaymentsMade
変更されたときに影響を受けるキーです。invoiceItems.count
またはpaymentsMade
が変更されると、バインドされているものすべてに通知paymentDue
が送信されます。
+ (NSSet *) keyPathsForValuesAffectingPaymentDue:
{
return [NSSet setWithObjects:@"invoiceItems.count", @"paymentMade", nil];
}
10.4 で実行している場合、または 10.4 以前をターゲットにしている場合は、代わりにこの方法を使用する必要がありますが、基本的には同じことになります。
編集2:
あなたの他のコメントを明確にするために; 配列内の各オブジェクトを手動で呼び出すことができます
[[NSNotificationCenter defaultCenter] postNotificationName:@"ModelDidChange" object:self];
次に、いくつかのコントローラー コードを使用して、オブジェクトからの通知の更新を登録できます。一意の通知名を選択すると、特定のオブジェクトから手動でリッスンする必要がなくなり、NSNotificationCenter
任意のオブジェクトからの通知を受け取るように に指示できます。コントローラーは、どのオブジェクトが変更されたかを非常に簡単に判断できます。
通知センターに登録します (これらのメソッドはコントローラー オブジェクトにある必要があります)。
// This string could really be just about anything you want, but make it conspicuous.
static NSString * const ModelDidChangeName = @"ModelDidChange";
- (void) awakeFromNib
{
// using nil for the object parameter will make the notification center
// invoke modelDidChange: regardless of who the sender is.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modelDidChange:) name:ModelDidChangeName object:nil];
}
通知を処理するメソッドを実装します。
- (void) modelDidChange:(NSNotification *) notification
{
MyModelClass *myObject = [notification object];
// do stuff with your model if necessary.
// do stuff with your view too
}
モデル オブジェクトの一部が変更されたときに通知を投稿するようにします。
@implementation MyModelClass
- (void) setSomething:(NSString *) newThing
{
[something autorelease];
something = [newThing copy];
if (something == nil)
{
// special case scenario for when something is nil
// do stuff, modify MyModelClass instance's attributes
[[NSNotificationCenter defaultCenter] postNotificationName:ModelDidChange object:self];
// the controller's modelDidChange: method is automatically invoked.
}
}
@end
しかし
モデルが適切に KVC に準拠し、適切な KVO コールバックで作成されている場合、手動通知は必要ありません。