4

一般的なカスタムアクセサメソッドは、次のように記述できます。

- (NSString *)name
{
    [self willAccessValueForKey:@"name"];
    NSString *myName = [self primitiveName];
    [self didAccessValueForKey:@"name"];
    return myName;
}

- (void)setName:(NSString *)newName
{
    [self willChangeValueForKey:@"name"];
    [self setPrimitiveName:newName];
    [self didChangeValueForKey:@"name"];
}

の意味は明らかですsetPrimitiveName。これにより、KVCなしで「raw」変数にアクセスし(アクセサー内の実行ループを防止)、渡された値を設定できます。同じ観察結果をゲッターに適用できます。

setPrimitiveNameドキュメントから、変更通知メソッドwillChangeValueForKeyと対応するメソッドが無効になっていることは明らかです。

今私の質問は次のとおりです:なぜあなたはそのメソッドを内部にラップする必要があるのwillChangeValueForKey:ですdidChangeValueForKey:か?

そこでコアデータプログラミングを読むと、次のように書かれています。

NSManagedObjectは、モデル化されたプロパティの自動Key-Value監視(KVO)変更通知を無効にし、プリミティブアクセサーメソッドはアクセスおよび変更通知メソッドを呼び出しません。モデル化されていないプロパティの場合、Mac OSXv10.4ではCoreDataは自動KVOも無効にします。Mac OS X v10.5以降では、CoreDataはNSObjectの動作を採用しています。

キー(アクセサーまたはインスタンス変数)にアクセスする準備ができていることを通知する必要があるのはなぜですか?誰に通知されますか?

私の質問が明確であることを願っています。前もって感謝します。

4

1 に答える 1

5

値が変更されたことをビューに通知するために必要です。たとえば、MKMapViewを使用してそれにいくつかの注釈を付け、Core Data から座標を取得し、その後、何らかの形でその場所を変更するとします。

ゲッター/セッターがこれらの通知を投稿しなかった場合、MKMapViewはこれらの場所の変更を認識せず、新しい場所に移動しません。

これらの通知を使用して、オブジェクトの作成日/変更日を追跡することもできます。

たぶん、そのやり直し/取り消しもこれでできています。

ノート

Core Data が内部でこれらの通知を何らかの方法で使用しているかどうかを知りたいです。誰かがこの主題について何か考えを持っていますか?

于 2012-04-14T11:27:50.337 に答える