如何根据相关对象转换 SwiftUI 获取请求结果?
How do I transform SwiftUI fetch request results based on related objects?
我正在构建一个需要动态谓词的 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] 应该看起来很特别。 messages[1] 的外观取决于 messages[0]。 messages[2] 依赖于 messages[1] 等等。我无法预先计算它,因为它可能会随时间变化。它应该在这个特定提取的上下文中计算 request/result.
我可以将其表示为 Message 对象上的一些瞬态计算 属性,然后视图代码可以使用它来分支。我可以有一个函数,我可以在其中给出特定的消息和消息数组,该函数查找消息和其他消息并根据它设置给定消息的状态。但是,SwiftUI 限制了我在 View 代码中可以做的事情,我不能这样执行函数。
我可以 运行 在我访问 wrappedValue 的地方映射或平面图,但那些不允许我访问集合的其他元素来做出决定(我认为?)。
在这种情况下,我将如何运行进行这种转换?
如果我正确理解了您的描述(并考虑到 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
}
我正在构建一个需要动态谓词的 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] 应该看起来很特别。 messages[1] 的外观取决于 messages[0]。 messages[2] 依赖于 messages[1] 等等。我无法预先计算它,因为它可能会随时间变化。它应该在这个特定提取的上下文中计算 request/result.
我可以将其表示为 Message 对象上的一些瞬态计算 属性,然后视图代码可以使用它来分支。我可以有一个函数,我可以在其中给出特定的消息和消息数组,该函数查找消息和其他消息并根据它设置给定消息的状态。但是,SwiftUI 限制了我在 View 代码中可以做的事情,我不能这样执行函数。
我可以 运行 在我访问 wrappedValue 的地方映射或平面图,但那些不允许我访问集合的其他元素来做出决定(我认为?)。
在这种情况下,我将如何运行进行这种转换?
如果我正确理解了您的描述(并考虑到 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
}