防止更新UITableViewCell的NSManagedObject引用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止更新UITableViewCell的NSManagedObject引用相关的知识,希望对你有一定的参考价值。
背景资料:
我们有一个应用程序,可以从Core Data中填充表格视图。这个应用程序有一个实现的同步机制,它在后台上下文中更新CoreData数据,并在完成后自动合并回主上下文。
为了使示例简单,让我们假设一个Message
和一个Comment
'实体',其中一个消息可以有零个或多个注释。我们已为所有实体分类NSManagedObjects
,因此在我们的comments
类上有一个名为Set<Comment>
(类型为Message
)的属性。
该应用程序的要求是视图可能仅在导航到新屏幕时更新屏幕上的数据。这意味着当您在屏幕上并在后台进行任何数据更新时,可见数据应保持不变。
我们的MessageViewcontroller
有一个私人财产message
,居住在viewDidLoad
。在cellForRowAt indexPath
里面我们使用cell.message = message.comments[indexPath.row]
。
问题:
这样做的问题是,如果我们在背景上下文中更新了注释,并将其合并回主上下文,则在tableview中“向上和向下滚动”(再次触发cellForRowAt indexPath
)将使用更新的文本更新单元格。
这是有道理的,因为我们的message
属性是一个表示CoreData中数据的引用。
题:
如何防止message
变量更新?或者换句话说:在加载视图控制器时,如何保留消息对象(及其关系)的“快照”?
解?
我认为唯一可行的解决方案是创建一个具有相同属性的结构,并在加载视图时填充该结构。我真的不喜欢这种方法,因为我们的模型比这个Message
示例更复杂,并且有许多关系,递归等。
从ios 9开始,您可以使用queryGenerationTokens
。生成令牌是指向核心数据在特定时间处于的状态的指针。您创建一个新的主队列managedObjectContext直接附加到持久性存储协调器,并将其queryGenerationToken
设置为当前的。同时将automaticallyMergesChangesFromParent
设置为false。在这个新上下文中执行提取,您将不会从核心数据发生的任何其他更新或更改中获得任何更新或更改。当用户离开页面时,您可以丢弃上下文,当他返回页面时,您可以创建一个新页面。上下文不是资源密集型的,您不应该害怕根据需要创建和丢弃它们。
以上是关于防止更新UITableViewCell的NSManagedObject引用的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 与 UIScrollView 防止单元格触摸
防止 CAGradientLayer 在 UITableViewCell 上的 UIImageView 内重叠
防止 UIView 被重新添加到 UITableViewCell