当我添加 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]
places 与 photos 有一对多的关系(我正在研究 CS193P)。也许我的 FRC 没有设置为观察相关表或其他东西的变化?
关于我的情况的一些附加信息:
我的 Core Data 更新和查询似乎没问题,因为我的“places”表在我第一次加载应用程序时总是正确的。 我的 FRC 确实更新了在应用程序加载时已经存在的行。它只是不会在运行时插入新的行/节。 我只使用一个 MOC。 MysectionNameKeyPath
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 委托停止触发?的主要内容,如果未能解决你的问题,请参考以下文章
当我使用 NSPredicate 为我的 UITableView 过滤我的数组时,应用程序崩溃
核心数据 - 为啥我的 NSPredicate 没有产生正确的 SQL 查询?
为啥我必须注释掉我的 NSPredicate 才能让 NSFetchedResultsController 填充 UITableView?