Core Data で関連するエンティティをプリフェッチしようとすると、KVO 例外がスローされるという問題があります。私には意味がなく、単純化されたプロジェクトで動作を複製することはできません。私は10.8をターゲットにしており、ARCを使用しています。
私のデータは音楽ライブラリをモデル化しており、関心のある 3 つのエンティティTrack
、 、Artist
、および がありAlbum
ます。トラックには 1 人のアーティストと 1 つのアルバムが含まれ、アルバムには 1 つのアーティストが含まれます。MyAlbum
とArtist
object は名前で一意です (ストア内で特定の名前を持つアーティストは 1 人だけです)。
次のフィールドを含むトラックのリストを表示したい: タイトル、アーティスト名、アルバム.タイトル。これは、NSTableView のTrack
エンティティとバインディングに NSArrayController を使用して簡単に実現できます。
ただし、アーティストとアルバムの関係を使用することがわかっているので、トラックが読み込まれるときにそれらをプリフェッチしたいと思います。次のようなカスタム performFetch: メソッドを使用して NSArrayController サブクラスを作成しました。
- (BOOL) fetchWithRequest:(NSFetchRequest *)fetchRequest merge:(BOOL)merge error:(NSError *__autoreleasing *)error
{
NSEntityDescription *entityDescription = [Track entityInManagedObjectContext:[self managedObjectContext]];
fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entityDescription];
[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"album", @"artist"]];
return [super fetchWithRequest:fetchRequest merge:merge error:error];
}
IB の NSArrayController のクラスを自分のサブクラスに設定したところ、UI の遅延がなくなることを期待していました (スクロールごとに障害が発生していました)。ただし、例外がスローされます。
2013-01-01 10:48:06.965 XXX[10593:303] からのキー パス「artist.name」のオブザーバーを更新できません。おそらく、キー「artist」の値が適切な KVO 通知なしで変更されたためです。送信済。Track クラスの KVO 準拠を確認します。
カスタムNSArrayController
サブクラスの前は、すべてが正しく機能していました。サブクラスのsetRelationshipKeyPathsForPrefetching
行をコメントアウトするだけで、すべてが再び機能します。NSArrayController
プリフェッチと KVO の間のリンクが何であるかを判断できません。Core Data の専門家で、これまでにこのようなことを見たことがありますか?