1

我有一个关于核心数据和通知的问题。阅读 Apple 文档后,我没有找到答案。

这就是问题所在:
我有一个具有一对多关系的托管对象。我想知道何时从这种关系中添加或删除了一个对象。(一个“类别”有很多“项目”)我用它来知道何时添加或删除项目的类别:

[category addObserver:self forKeyPath:@"items" 
   options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew 
   context:nil];

然后调用这个方法:

- (void)observeValueForKeyPath:(NSString *)keyPath 
   ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

问题:
假设一个类别有 2 个项目,我删除了其中一个。现在该类别只有 1 个项目。但是,如果我从 启动一个获取的请求observeValueForKeyPath,它会说该类别有 2 个项目,但这是错误的,因为它现在有 1 个。

我想这是因为observeValueForKeyPath在保存上下文时调用,[context save:&error](这是我在 Apple 文档中找到的唯一内容),也许修改[context save:&error]在行结束之前无效。因此,为了测试我的理论,我修改了我的observeValueForKeyPath代码,并将所有代码移到了一个方法中,我使用了:

 [self performSelector:@selector(launchFetchedRequest) 
   withObject:nil afterDelay:0];

为了在下一个运行循环中执行该方法,也就是在[context save:&error]. 瞧,现在一切正常。

那么,如果我想在内部启动一个 fetch 请求observeValueForKeyPath,我是否必须在下一个运行循环中启动它?这是正常行为吗?你通常是怎么做的?

我想知道你对这个话题的看法。提前致谢。

4

2 回答 2

1

我从来没有尝试过从那里取货。此外,您没有说明您使用哪个 MOC 来实现更改,以及您使用哪个 MOC 来查询。

尽管如此,大多数与 fetch 相关的问题没有返回您认为应该返回的内容,这是由于 shouldRefreshRefetchedObjects 设置的结果。

确保正确配置您正在使用的 NSFetchRequest 的 shouldRefreshRefetchedObjects 属性,以便为您提供所需的结果。

于 2012-04-17T00:55:16.600 回答
1

里卡多,

使用object参数。这是你的category收藏。您所要做的就是查看其中的内容,因此您实际上不需要运行查询并点击托管对象上下文。

这里的问题是通知事件在集合更改(KVO)时被触发并使用另一个线程循环,并且主线程尚未将更改传播到托管对象上下文中。如果你使用了object参数,它应该是正确的。

于 2012-04-17T01:31:05.887 回答