0

この場合に発生する問題を解決しようとしています:

  1. ユーザーは外部ソースからデータの読み込みを開始できます。データが読み込まれると、CoreData を介して保存されます。次に、いくつかのビューに表示され、他のいくつかのクラスが NSManagedObjects への参照を取得しました。
  2. データの読み込みは、他の条件 (たとえば、アプリケーションがバックグラウンドから再開したとき) によって開始される場合があります。新しい外部データが受信され、dataController は以前のデータを削除して新しいデータを作成します。そして、ここに問題があります。すべてのデータ コンシューマー クラスに、新しいインスタンスをロードする必要があることを通知したいと思います (削除されたオブジェクトへの参照を送信して、所有する参照と比較し、新しいデータ バージョンを要求するかどうかを判断できるようにします)。しかし、コンシューマー クラスを削除した後、プロパティのない障害への参照があり、その ObjectID は役に立たず (新しいインスタンスが保存されたため)、その新しいバージョンをどのようにロードするかわかりません。

NSManagedObject ラッパーを実装できます。

@interface Model : NSObject

- (id)initWithUniqueId:(id)uniqueId dataObject:(NSManagedObject *)dataObject;

@property (nonatomic, strong, readonly) id uniqueId;
@property (nonatomic, strong, readonly) NSManagedObject *dataObject;

@end

このオブジェクトは、dataObject がフォルトになった後に自身を再ロードできます。しかし、このアプローチは間違っていて、このオーバーヘッドは必要ないのではないでしょうか? また、NSManagedObject は、更新ではなく、本当に削除された場合にのみ削除する必要がありますか? オブジェクトが更新された場合は、KVO を使用してプロパティの変更を処理できます。オブジェクトが削除された場合は、変更の NSManagedObjectContext 通知を監視し、削除されたオブジェクトを探すことができます。

私はあなたがどの方法を好むのか、そしてその理由を知りたいだけです(おそらく他のアプローチが好きかもしれません)?前もって感謝します。

4

1 に答える 1

1

外部データ ソースを使用している場合は、ある種の一意の ID の独自のバージョンが理にかなっています。

その後、すべてがシンプルになります。データをロードし、コンテキストを保存するときに永続ストアを更新し、NSNotificationCenter. すべてのリスナーは、再取得することで簡単にデータを更新できるようになりました。

(デリゲート メソッドを実装するフェッチされた結果コントローラーは、通知センター経由で通知を受ける必要さえありません。)

于 2013-09-05T10:38:01.633 に答える