如何根据相关对象转换 SwiftUI 获取请求结果?

Posted

技术标签:

【中文标题】如何根据相关对象转换 SwiftUI 获取请求结果?【英文标题】:How do I transform SwiftUI fetch request results based on related objects? 【发布时间】:2019-12-31 11:02:19 【问题描述】:

我正在构建一个需要动态谓词的 SwiftUI 列表。该方法在这里讨论:https://www.hackingwithswift.com/books/ios-swiftui/dynamically-filtering-fetchrequest-with-swiftui

到目前为止,这是我的代码:

struct SomeView: View 

    var collection: Collection
    var messages: FetchRequest<Message>

    init(collection: Collection) 
        let predicate : NSPredicate = NSPredicate(format: "collection = %@", collection)
        self.collection = collection
        self.messages = FetchRequest<Message>(entity: Message.entity(), sortDescriptors: [NSSortDescriptor(key: "date", ascending: true)], predicate: predicate)
    

    var body: some View 
        List(messages.wrappedValue, id: \.uniqueIdentifier)  message in
            // construct the UI
        
    

到目前为止一切顺利。

我不知道该怎么做:我需要根据结果中的一些 other 消息转换 messages 元素(为简单起见,我们假设基于之前的消息)。 messages[0] 看起来应该是一种特殊的方式。消息[1] 的外观取决于消息[0]。消息[2] 依赖于消息[1] 等等。我无法预先计算,因为它可能会随时间而变化。它应该在这个特定的获取请求/结果的上下文中计算。

我可以将其表示为 Message 对象上的一些瞬态计算属性,然后视图代码可以使用该属性进行分支。我可以有一个函数,在其中给出特定消息和消息数组,该函数查找消息和其他消息并基于此设置给定消息的状态。但是,SwiftUI 限制了我在 View 代码中可以做的事情,我不能以这种方式执行函数。

我可以在访问 WrappedValue 的地方运行 map 或 flatmap,但它们不允许我访问集合的其他元素来做出决定(我认为?)。

在这种情况下我将如何进行这种转换?

【问题讨论】:

【参考方案1】:

如果我正确理解了您的描述(并考虑到 FetchedResultsRandomAccessCollection),我将采用以下方法

var body: some View 
    List(messages.wrappedValue, id: \.uniqueIdentifier)  message in
        rowView(for: message, from: messages.wrappedValue)
    


func rowView(for message: Message, from result: FetchedResults<Message>) -> some View 
   // having .starIndex, .endIndex, .position, etc. do any dependent calculations here
   // and return corresponding View

【讨论】:

谢谢。正是我需要的,有效。只是一个细节,我不确定 SwiftUI 的最佳做法是什么 - rowView 函数应该在 SomeView 结构内部,还是作为单独的全局函数在外部? 我认为这取决于设计......如果这些生成的视图是相同类型的视图,那么它可以是该视图的工厂方法(静态),如果它们完全不同,可以只是工厂全局功能等

以上是关于如何根据相关对象转换 SwiftUI 获取请求结果?的主要内容,如果未能解决你的问题,请参考以下文章

根据对多关系中相关对象的计数对获取请求进行排序

SwiftUI Map 混合注释

SwiftUI - 使用 CoreData 获取的结果来填充选取器

SwiftUI 如何获取对 List 内编辑 Textfield 的参考?

SwiftUI CoreData - 存储获取请求数据

SwiftUI 如何获取自定义幻灯片转换的视图大小?