gpt4 book ai didi

ios - 防止 NSManagedObject 引用更新 UITableViewCell

转载 作者:行者123 更新时间:2023-11-28 12:12:40 25 4
gpt4 key购买 nike

背景信息:

我们有一个从 Core Data 填充表格 View 的应用程序。此应用实现了同步机制,可在后台上下文中更新 CoreData 数据,并在完成后自动合并回主上下文。

为使示例简单,我们假设一个 Message和一个 Comment “实体”,消息可以有零个或多个评论。我们有子类 NSManagedObjects对于我们所有的实体,因此有一个名为 comments 的属性(类型为 Set<Comment> )在我们的 Message 上类。

应用的一个要求是,当导航到新屏幕时, View 可能更新屏幕上的数据。这意味着当您在屏幕上并且任何数据在后台更新时,可见数据应保持相同

我们的 MessageViewcontroller有私有(private)属性(property)messageviewDidLoad 中填充.里面cellForRowAt indexPath我们使用 cell.message = message.comments[indexPath.row] .

问题:

问题在于,如果我们在后台上下文中更新了一条评论,该评论会合并回主上下文,则在表格 View 中上下“滚动”(再次触发 cellForRowAt indexPath)将更新单元格带有更新的文本。

这是有道理的,因为我们的 message property 是一个引用,代表我们 CoreData 中的数据。

问题:

如何防止 message更新的变量?或者换句话说:加载 View Controller 时如何保留消息对象(及其关系)的“快照”?

解决方案?

我认为唯一可行的解​​决方案是创建一个具有相同属性的结构并在加载 View 时填充它。我不太喜欢这种方法,因为我们的模型比这个复杂得多 Message例如,有很多关系、递归等。

最佳答案

从 iOS 9 开始,您可以使用 queryGenerationTokens。生成 token 是指向核心数据在特定时间所处状态的指针。您创建一个新的主队列 managedObjectContext 直接附加到持久存储协调器并将其 queryGenerationToken 设置为当前的。同时将 automaticallyMergesChangesFromParent 设置为 false。在这个新的上下文中执行您的提取,您将不会从核心数据发生的任何其他事情中获得任何更新或更改。当用户离开页面时,您可以丢弃上下文,当他返回页面时,您可以创建一个新上下文。上下文不是资源密集型的,您不应该害怕根据需要创建和丢弃它们。

关于ios - 防止 NSManagedObject 引用更新 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47923032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com