私はカスタムNSManagedObject
サブクラスを持っていPerson
ます. また、 のさまざまなプロパティを観察するために をUIView
登録しました。その中には、「名前」のように永続的なものもあれば、「飲酒」のように、コア データとは関係のない単なる KVO 準拠のアクセサーもあります。-addObserver:forKeyPath:options:context:
Person
@interface Person : NSManagedObject
{
BOOL drinking;
}
@property (nonatomic, retain) NSString* name;
@property (nonatomic, readonly) BOOL drinking;
@end
@implementation Person
@dynamic name;
...
- (void) getDrunk {
[self willChangeValueForKey: @"drinking"];
drinking = YES;
[self didChangeValueForKey: @"drinking"];
}
...
@end
すべてが機能します。-getDrunk
プロパティを送信または設定するたびにname
、ビューに通知されます。NSManagedObject
次のようなドキュメントを読むときを除いて、私は幸せな男です。
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
事実 1. 受信者がキーのキー値監視変更通知の自動サポートを提供する場合は YES、そうでない場合は NO。
事実 2. NSManagedObject のデフォルトの実装は、モデル化されたプロパティに対して NO を返し、モデル化されていないプロパティに対して YES を返します。
今、私は上記の 2 つの事実をドキュメントから解析しようと懸命に努力しています。事実 2 を確認するのは簡単で、クラス Person は実際に @"name" に対して NO を返し、@"drinking" に対して YES を返します。では、名前が変更されたときに、ビューはどのように通知されるのでしょうか? KVOのドキュメントは明確に言っています、
自動オブザーバー通知を使用すると、キー値コーディングおよびキー値コーディング準拠のメソッドを介してプロパティを変更するときに、 willChangeValueForKey: および didChangeValueForKey: の呼び出しでプロパティへの変更を括弧で囲む必要はありません。
そのため、Person が @"name" に対して NO を返した場合、KVO が機能する+automaticallyNotifiesObserversForKey:
ようにネーム セッターを手動でラップする必要があるように思われます。will/didChangeValueForKey:
ただし、KVO は問題なく動作します。私は何が欠けていますか?標準の KVO 動作を変更していないように見える場合、それNSManagedObject
を上書きして文書化することのポイントは何ですか?+automaticallyNotifiesObserversForKey:
正気を取り戻すのを手伝ってください。