gpt4 book ai didi

macos - 核心数据预取和 KVO 合规性

转载 作者:行者123 更新时间:2023-12-03 16:21:29 30 4
gpt4 key购买 nike

如果我尝试预取核心数据中的相关实体,我会遇到抛出 KVO 异常的问题。这对我来说没有任何意义,而且我似乎无法在简化的项目中复制该行为。我的目标是 10.8 并使用 ARC。

我的数据模型是一个音乐库,我有三个感兴趣的实体:TrackArtistAlbum。一首轨道有一位艺术家和一张专辑,而一张专辑则有一位艺术家。我的 AlbumArtist 对象的名称是唯一的(商店中只有一位具有给定名称的艺术家)。

我想显示包含以下字段的轨道列表:标题、艺术家名称、专辑标题。使用 NSArrayController 作为 Track 实体和 NSTableView 中的绑定(bind)可以轻松完成此操作。

但是,由于我知道我将使用艺术家和专辑关系,因此我想在加载轨道时预取它们。我使用自定义的 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] Cannot update for observer for the key path "artist.name" from , most likely because the value for the key "artist" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the Track class.

在自定义 NSArrayController 子类之前,一切正常。通过简单地注释掉我的 NSArrayController 子类中的 setRelationshipKeyPathsForPrefetching 行,一切都会恢复正常。我无法确定预取和 KVO 之间的联系是什么。核心数据专家以前见过类似的事情吗?

最佳答案

我遇到了本质上相同的问题,这是我在解决它时学到的:

似乎 NSArrayController 在所有情况下都不能很好地与 setRelationshipKeyPathsForPrefetching: 配合使用。我在子上下文中执行预取请求,这最终破坏了父上下文中 NSArrayController 的 KVC,我认为这是意外行为。无论如何,我修复它的方法是使用 "old" style (10.4) prefetching ,看起来像......

NSFetchRequest *trackReq = [[NSFetchRequest alloc] initWithEntityName:@"Track"];
NSArray *fetchedTracks = [context executeFetchRequest:trackReq error:&error];

NSFetchRequest *batchFaultReq = [[NSFetchRequest alloc] initWithEntityName:@"Artist"];
[batchFaultReq setPredicate:[NSPredicate predicateWithFormat:@"SELF.tracks in %@", fetchedTracks];
NSArray *faultedItems = [context executeFetchRequest:batchFaultReq error:&error];

// do something with fetchedTracks

...如何将其插入到您的 NSArrayController 子类中是另一回事 - 我并不清楚如何在 fetchWithRequest: 重写中使用此方法,因为您在执行批量故障请求之前需要获取结果。顺便说一句,您是否尝试过延迟获取标志?

关于macos - 核心数据预取和 KVO 合规性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14111848/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com