gpt4 book ai didi

ios - 为什么在 observeValueForKeyPath 中启动此请求时获取的请求不是最新的?

转载 作者:行者123 更新时间:2023-11-29 11:14:31 25 4
gpt4 key购买 nike

我有一个关于核心数据和通知的问题。看了 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] 之后。瞧,现在一切正常。

所以,如果我想在 observeValueForKeyPath 中启动一个获取请求,我是否必须在下一个运行循环中启动它?这是正常行为吗?你通常如何做到这一点?

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

最佳答案

里卡多,

使用object 参数。这是您的类别 集合。您所要做的就是查看其中的内容,因此您实际上不需要运行查询并访问托管对象上下文。

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

关于ios - 为什么在 observeValueForKeyPath 中启动此请求时获取的请求不是最新的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063206/

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