繁体   English   中英

从 Swift 核心数据中的关系中获取最新实体

[英]Fetching the latest entity from a relationship in Swift Core Data

我试图找到从与 swift 和核心数据的关系中获取最新实体的最佳方法。

例如,我与许多消息进行了对话:

Conversation Entity:
id = 1, name = "Test"
Message Entity:
id = 1, body = "Test", conversation = 1
id = 2, body = "Test", conversation = 1

在我的 SwiftUI 视图中,我有这个 FetchRequest:

@FetchRequest(sortDescriptors: []) var conversations: FetchedResults<Conversation>

在像这样循环查看 View 中的对话时,访问关系并获得最新结果的最佳方法是什么:

List(conversations) { conversation in
    Text(conversation.name ?? "")
    Text(conversation.messages.latest.body ?? "") // <--- Trying to do something like this
}

最好的方法是将您需要的数据存储在您正在获取的实体中。 因此,在您的情况下,在对话实体上创建一个latestMessageBody属性。 Apple 提供派生属性来自动执行此操作。

将 Core Data 视为关系数据库是一个常见的错误,而只是将其视为一种持久化您在屏幕上看到的内容并根据您想要获取和显示实体的方式设计实体的方式。 如果您在一个屏幕上进行太多获取,那么是时候重新设计实体了。

即,您不希望为要显示的所有转换获取太多获取的最新消息。 而且您不想为每个对话加载所有消息,只是为了找到最新消息,因为 memory 开销太高。 这就是 Core Data 通过派生属性特性提供非规范化的原因。

另一点是@FetchRequest (顺便说一下由NSFetchedResultsController提供支持)仅跟踪对当前获取的实体的更改。 因此,如果您进入关系以显示数据,则当相关的 object 更改时,该视图将不会更新。 您可以通过将 object 传递到另一个标有@ObservedObject的视图中来解决此问题,但这不适用于一对多关系。

使用实体 inheritance 允许NSFetchedResultsController处理多个实体有一个巧妙的技巧,但我认为这不适合这个用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM