更新相关 NSManagedObject 时更新 UITableView

Posted

技术标签:

【中文标题】更新相关 NSManagedObject 时更新 UITableView【英文标题】:Update UITableView when related NSManagedObject is updated 【发布时间】:2013-01-22 07:57:47 【问题描述】:

我在核心数据实体(托管对象)之间有以下关系层次结构:

实体1 > 实体2 > 实体3

Entity1Entity2 之间存在一对一关系,Entity2Entity3 之间存在一对多关系。

我有一个使用NSFetchedResultsController 显示Entity1 记录列表的视图控制器。 UITableViewCell 显示来自Entity1Entity2Entity3 的信息。现在,NSFetchedResultsControllerDelegate 方法会在添加/更新/删除Entity1 对象时自动调用,但是当添加/更新/删除相关的Entity2Entity3 记录时,不会调用委托方法。

在这种情况下,识别相关记录已更新以及UITableViewCell 也需要更新的最佳或可能方法是什么?

【问题讨论】:

【参考方案1】:

你需要弄脏其他实体的属性。换句话说,你应该调用

[self willChangeValueForKey:@"someProperty"];
[self didChangeValueForKey:@"someProperty"];

关于您要更新的实体。

这里有一个示例解决方案,可以实现您想要实现的目标。

NSFetchedResultsController pitfall

希望对您有所帮助。

【讨论】:

这是一个不错的技巧。 - 除了重写相关实体的访问器方法(如链接中所建议的那样),还可以侦听NSManagedObjectContextObjectsDidChangeNotification,如果“Entity2”或“Entity3”对象已更改,请将相关“Entity1”对象标记为肮脏的。 - 另一个想法:向“Entity1”添加一个瞬态“dummy”属性。要将对象标记为脏,您只需为 dummy 属性分配一个值。 @MartinR 感谢其他建议。 ;) willChange/DidChange 显然不起作用(不再),也没有将值设置为 nil 然后回到实际值......为我做的诀窍是引入了一个短暂的“脏" 属性并将其设置为时间戳

以上是关于更新相关 NSManagedObject 时更新 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

在更新时跟踪 NSManagedObject 属性并立即更新视图

应更新数据时,NSManagedObject 的删除/插入与更新

使用不同的 NSManagedObjectContexts 时更新 NSManagedObject

当关系发生变化时,是不是有更新 NSManagedObject 的好方法?

NSManagedObject 时间戳更新

xCode 8 会自动更新 NSManagedObject,是吗?