背景信息:
我们有一个应用程序,可以从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
示例更复杂,并且有许多关系,递归等。
答案 0 :(得分:1)
从iOS 9开始,您可以使用queryGenerationTokens
。生成令牌是指向核心数据在特定时间处于的状态的指针。您创建一个新的主队列managedObjectContext直接附加到持久性存储协调器,并将其queryGenerationToken
设置为当前的。同时将automaticallyMergesChangesFromParent
设置为false。在这个新上下文中执行提取,您将不会从核心数据发生的任何其他更新或更改中获得任何更新或更改。当用户离开页面时,您可以丢弃上下文,当他返回页面时,您可以创建一个新页面。上下文不是资源密集型的,您不应该害怕根据需要创建和丢弃它们。