1

コアデータで属性が変更されたかどうかを確認し、UIを更新したいと思います。タイプNSPrivateQueueConcurrencyTypeの管理対象オブジェクトコンテキストで実行されているバックグラウンドフェッチの結果として、属性が変更される場合があります。

リスナーを追加しました:[myCoreDataEntity addObserver:self forKeyPath:myCoreDataAttribute options:NSKeyValueObservingOptionNew context:nil]

しかし、イベントは決して発生しません。なぜですか?オブジェクトは別のコンテキストで変更されます-これが理由でしょうか?(save:が親コンテキストで実行されても、何も起動しません)。

手動のKVOを使用できますが、オブジェクトはまだ親コンテキストに保存されていないため、NSPrivateQueueConcurrencyTypeに関連付けられたコンテキストでオブジェクトが変更されたときにNSMainQueueConcurrencyTypeのコンテキストを指しているため、UIの更新は機能しません。

4

2 に答える 2

1

間違ったオブジェクトを観察しているため、通知を受け取っていません。NSEntityDescription実行時に変更されることはありません。これは、エンティティがデータモデルで定義された方法を表しています。ただし、エンティティの説明を使用するインスタンスはNSManagedObject、実行時に変更できます。特定の管理対象オブジェクトで属性が変更されたかどうかを知りたい場合は、その特定のオブジェクトを監視する必要があります。

管理対象オブジェクトがその属性の値を変更するたびに通知を受け取る必要がある場合は、その属性のカスタムセッターを作成し、そこで処理するのが最善のオプションです。役に立つかもしれませんNSManagedObjectContextObjectsDidChangeNotificationが、それは属性の変更に対して発火します。

于 2013-01-08T00:35:15.197 に答える
0

あなたの例が管理対象オブジェクトであると仮定するとmyCoreDataEntity、問題は、モデル化されたプロパティの自動外部変更通知が[管理対象オブジェクトのコアデータによって無効にされる]ことです1

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

特定のプロパティ、または管理対象オブジェクトサブクラスまたは管理対象オブジェクトサブクラスのカテゴリ内のすべてのプロパティに対してこれらをオンにすることができます。

単一のプロパティ:

- (BOOL) automaticallyNotifiesObserversFoMyCoreDataAttribute {
    return YES;
}

すべてのプロパティ(非推奨):

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
    return YES;
}

自動変更通知を送信しない理由は、主にパフォーマンスです。自動変更通知は、いくらかのオーバーヘッドを追加しますが、最近のハードウェアでは、何千ものオブジェクトを操作している場合でも、それはかなりマイナーです。いつものように、プロファイルを作成して、何が効果的かを確認してください。

于 2014-08-06T06:44:02.950 に答える