21

私はカスタム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:

正気を取り戻すのを手伝ってください。

4

2 に答える 2

20

さて、プロパティ (およびメソッド)NSManagedObjectの実装を提供します。Core Data によって提供される実装には、 および への呼び出しが含まれていると思います。name- name- setName:willChangeValueForKey:didChangeValueForKey:

したがって、KVO は、動作させるために何もする必要がないという意味では「自動」ですが、動的な機能を提供するメソッドによって呼び出されているという意味では自動ではないと思いますプロパティの実装。willChangeValueForKey:didChangeValueForKey:NSManagedObject

于 2010-09-16T16:14:42.013 に答える