如果我尝试在 Core Data 中预取相关实体,则会引发 KVO 异常。这对我来说没有任何意义,我似乎无法在简化项目中复制这种行为。我的目标是 10.8 并使用 ARC。
我的数据为音乐库建模,我有三个感兴趣的实体:Track
、Artist
和Album
。曲目有一个艺术家和一个专辑,而专辑有一个艺术家。我的Album
和Artist
对象的名称是唯一的(商店中只有一位具有给定名称的艺术家)。
我想显示包含以下字段的曲目列表:标题、艺术家姓名、专辑标题。这很容易使用 NSArrayController 来实现Track
实体和 NSTableView 中的绑定。
但是,由于我知道我将使用艺术家和专辑关系,所以我想在加载曲目时预取它们。我使用自定义 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” from ,很可能是因为在没有适当的 KVO 通知的情况下,关键“艺术家”的值已更改发送。检查 Track 类的 KVO 合规性。
在自定义NSArrayController
子类之前一切正常。通过简单地注释掉setRelationshipKeyPathsForPrefetching
我的NSArrayController
子类中的行,一切都会再次起作用。我无法确定预取和 KVO 之间的联系是什么。以前有没有 Core Data 专家见过这样的事情?