更新相关 NSManagedObject 时更新 UITableView
Posted
技术标签:
【中文标题】更新相关 NSManagedObject 时更新 UITableView【英文标题】:Update UITableView when related NSManagedObject is updated 【发布时间】:2013-01-22 07:57:47 【问题描述】:我在核心数据实体(托管对象)之间有以下关系层次结构:
实体1 > 实体2 > 实体3
Entity1
和 Entity2
之间存在一对一关系,Entity2
和 Entity3
之间存在一对多关系。
我有一个使用NSFetchedResultsController
显示Entity1
记录列表的视图控制器。 UITableViewCell
显示来自Entity1
、Entity2
和Entity3
的信息。现在,NSFetchedResultsControllerDelegate
方法会在添加/更新/删除Entity1
对象时自动调用,但是当添加/更新/删除相关的Entity2
或Entity3
记录时,不会调用委托方法。
在这种情况下,识别相关记录已更新以及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