当我添加 NSPredicate 时,为啥我的 NSFetchedResultsController 委托停止触发?

Posted

技术标签:

【中文标题】当我添加 NSPredicate 时,为啥我的 NSFetchedResultsController 委托停止触发?【英文标题】:Why does my NSFetchedResultsController delegate stop firing when I add an NSPredicate?当我添加 NSPredicate 时,为什么我的 NSFetchedResultsController 委托停止触发? 【发布时间】:2012-03-17 14:19:03 【问题描述】:

我有一个NSFetchedResultsController 在表格视图中显示“地点”,但是当我更新应该在另一个视图控制器中显示的地点集时,我的 FRC 不会更新表格视图。

这是普遍的问题。我的具体案例似乎围绕支持我的 FRC 的 NSPredicate 展开,因为当我删除 NSPredicate(并且只获得 所有 个位置)时,一切正常。

我的查询是

@"ANY photos.isFavorite == %@", [NSNumber numberWithBool:YES]

placesphotos 有一对多的关系(我正在研究 CS193P)。也许我的 FRC 没有设置为观察相关表或其他东西的变化?

关于我的情况的一些附加信息:

我的 Core Data 更新和查询似乎没问题,因为我的“places”表在我第一次加载应用程序时总是正确的。 我的 FRC 确实更新了在应用程序加载时已经存在的行。它只是不会在运行时插入新的行/节。 我只使用一个 MOC。 My sectionNameKeyPath is not set to a transient attribute. My cacheName is set to nil.

【问题讨论】:

【参考方案1】:

我不知道是不是你的情况,但我还是会发布。也许这可能是一个有效的解决方法。

NSFetchedResultsController pitfall

希望对你有帮助。

【讨论】:

是的,就是这样。作为记录,FRC 不会获取实体上的更改,而不是它打算获取的类型。解决方法是手动“弄脏”相关实体(在我的情况下是相关的place),以便 FRC 看到更改。非常感谢!【参考方案2】:

您是否尝试过测试更简单的谓词,例如使用照片一对一关系而不是照片?

“我的 FRC 没有更新表格视图” - 您使用的是 -controllerDidChangeContent: 吗?您是否确认它没有被调用?我已经看到,与文档相反,从该方法中调用 tableView 上的 reloadData 是不安全的,因为该方法可能在辅助线程而不是主线程上调用。

您是否在同一个(主?)线程上执行与 MOC 相关的所有操作?

【讨论】:

一个更简单的谓词确实有效。当我完全省略谓词或使用严格处理 places 的谓词(而不是提示连接到 photos)时,表格视图会按预期更新。 (回答你的另外两个问题:是的。)【参考方案3】:

试试这个谓词?

@"%@ IN photos.isFavorite", [NSNumber numberWithBool:YES]

【讨论】:

以上是关于当我添加 NSPredicate 时,为啥我的 NSFetchedResultsController 委托停止触发?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的应用在使用 cloudkit 时会崩溃?

当我使用 NSPredicate 为我的 UITableView 过滤我的数组时,应用程序崩溃

核心数据 - 为啥我的 NSPredicate 没有产生正确的 SQL 查询?

为啥我必须注释掉我的 NSPredicate 才能让 NSFetchedResultsController 填充 UITableView?

当我添加自动布局约束时,为啥我的 textview 不显示?

当我添加游戏循环时,为啥我的 Java 游戏会崩溃?