Core data 如何基于相关对象转换SwiftUI获取请求结果?

Core data 如何基于相关对象转换SwiftUI获取请求结果?,core-data,swiftui,fetchrequest,Core Data,Swiftui,Fetchrequest,我正在构建一个SwiftUI列表,其中需要一个动态谓词。这里讨论了该方法: 以下是我目前的代码: struct SomeView: View { var collection: Collection var messages: FetchRequest<Message> init(collection: Collection) { let predicate : NSPredicate = NSPredicate(format: "coll

我正在构建一个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
        }
    }
}
struct SomeView:View{
变量集合:集合
var消息:FetchRequest
初始化(集合:集合){
let谓词:NSPredicate=NSPredicate(格式:“collection=%@”,collection)
self.collection=collection
self.messages=FetchRequest(实体:Message.entity(),sortDescriptors:[NSSortDescriptor(键:“日期”,升序:true)],谓词:谓词)
}
var body:一些观点{
列表(messages.wrappedValue,id:\.uniqueIdentifier){message in
//构建用户界面
}
}
}
到目前为止还不错

我不知道该怎么做:我需要基于结果中的一些其他消息(为了简单起见,让我们基于前面的消息)转换
消息
元素。消息[0]应以特定方式显示。消息[1]的外观取决于消息[0]。消息[2]依赖于消息[1],依此类推。我无法预先计算,因为它可能随时间而变化。它应该在这个特定的获取请求/结果的上下文中计算

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

我可以在访问wrappedValue的地方运行map或flatmap,但它们不允许我访问集合的其他元素来做出决策(我想是吧?)


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

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

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
}
var主体:一些视图{
列表(messages.wrappedValue,id:\.uniqueIdentifier){message in
行视图(用于:消息,来自:messages.wrappedValue)
}
}
func行视图(对于消息:message,来自结果:FetchedResults)->some视图{
//让.starIndex、.endIndex、.position等在此处执行任何相关计算
//并返回相应的视图
}

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