gpt4 book ai didi

ios - controllerDidChangeContent 为什么/如何工作?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:08:56 24 4
gpt4 key购买 nike

我正在为 iOS 6.1 编写代码并学习如何使用 Core Data。

fetchedObjects 的文档说:

“结果数组反射(reflect)了 Controller 的托管对象上下文中托管对象的内存状态,而不是它们在持久存储中的状态。但是,返回的数组不会随着托管对象的插入、修改或删除而更新”

最后一句话与我所看到的有关。

即,我从一个实体获取数据,我对获取的对象进行计数 (fetchedObjects.count),然后我得到了我期望的结果。

然后我创建一个新对象并保存它,然后我再次执行 fetchedObjects.count 并获得与上次相同的结果 - 没有像我预期的那样增加一个。

所以,我的问题是如何在保存上下文后更新 fetchedObjects。

我阅读了有关使用 NSFetchedResultsControllerDelegate here 的信息并尝试了一些建议,即我使用委托(delegate)。

我指定自己为委托(delegate)。

 frc.delegate = self;

我这样添加委托(delegate):

@interface DB : NSObject <NSFetchedResultsControllerDelegate>

然后我像这样实现了委托(delegate)回调:

- (void) controllerDidChangeContent: (NSFetchedResultsController *) controller
{
;
}

这一切都奏效了。但我不明白为什么。

如果我删除上面的三位委托(delegate)代码,当我创建一个新对象时,我的代码会失败,保存我的上下文然后执行 fetchedObjects.count。它因计数不足一而失败。

如果我加回 NSFetchedResultsControllerDelegate 和 frc.delegate = self;位并省略回调例程,它仍然失败。

只有当我也重新添加回调例程(顺便说一句,它没有任何功能)时,我的代码才会成功。

这让我有点偏执 - 想知道如果回调什么都不做为什么它会起作用,以及它是否会在 99% 的时间内起作用然后在蓝色月亮中失败一次?

因此,我创建了一个 bool 值并将其设置在回调例程中,这样我的代码在看到 bool 值翻转之前不会执行保存后计数。但是,我认为这可能是多余的 - 甚至可能是愚蠢的。

oldCount = frc.fetchedObjects.count;
<create a new object here>
frcDelegateCalled = FALSE;
[self saveDB];
[frc.managedObjectContext processPendingChanges];
while ( frcDelegateCalled == FALSE );
newCount = frc.fetchedObjects.count;

- (void) controllerDidChangeContent: (NSFetchedResultsController *) controller
{
frcDelegateCalled = TRUE;
}

因此,processPendingChanges 调用显然加快了更新,我的 bool 值确保已调用回调,表明在我重新计数之前 fetchedObjects 已更新。

我有点困惑为什么代码仅仅因为存在回调就可以工作。任何人都可以在这里阐明一些问题吗?

最佳答案

只有有权访问内部结构的人才能确定地回答,但这是我的猜测。

NSFetchedResultsController 通过监听 NSManagedObjectContextObjectsDidChangeNotification 来工作,它被发送了很多次。作为优化,如果获取的结果 Controller 没有委托(delegate),或者委托(delegate)未实现部分或全部方法,则它可能不会响应通知。

正如 MartinR 所提到的,这实际上在文档中有说明,您所看到的是预期的行为:

Important: A delegate must implement at least one of the change tracking delegate methods in order for change tracking to be enabled. Providing an empty implementation of controllerDidChangeContent: is sufficient.

如果您想知道提取结果何时发生变化,FRC 委托(delegate)方法是您无论如何都应该做的地方。

关于ios - controllerDidChangeContent 为什么/如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18685994/

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