【发布时间】:2020-03-03 12:02:55
【问题描述】:
由于关系是集合,我在 SwiftUI 中显示我的核心数据时遇到了问题。在 SwiftUI ForEach 循环中显示多个关系集的最佳方式是什么?
例如,我在核心日期中有两个实体:条目和职位。条目可以包含多个位置,每个位置只能属于一个条目。
我将条目作为@binding var 在应该显示条目位置的视图上。理想情况下,我希望直接从此条目变量访问位置,但由于位置是一个集合,我收到以下错误:
错误 'ForEach' 要求 'Set' 符合 'RandomAccessCollection'
@Binding private var entry: Entry?
ForEach(entry?.positions) { position in
Text("position here")
}
解决方案一:
或者,我可以对所有职位进行获取请求,然后过滤掉所有不属于实体的职位,我不喜欢这个想法,因为我可能会获取数千个职位而只获得几个职位。 (或者我想错了吗?我是核心数据的新手,因为 swiftui 而来自领域)
虽然如果我可以仅在 @binding 条目 var 上进行提取,并将其所有位置作为已排序的提取结果提取,这可能会起作用,但我不确定是否有办法做到这一点。
可能是这样,或者如果可能有数千个条目,每个条目都有 10-20 多个位置,这会是一个性能问题吗? objectID 可以这样使用吗?如果条目被移到另一个期刊,它仍然是唯一的吗?:
@Binding private var entry: Entry?
@FetchRequest(
entity: Position.entity(),
sortDescriptors: [],
predicate: NSPredicate(formate: "entry.objectID == %@", self.entry.objectID)
) var positions: FetchedResults<Position>
解决方案二:
我想为诸如“日期”之类的位置添加一个属性,这样可以比较和排序位置吗?但不确定如何使用 SwiftUI 进行更新,因为它只会在 init() 中完成一次。
let list = entry.wrappedValue?.positions?.sorted()
核心数据模型:
public class Entry: NSManagedObject, Identifiable {
// MARK: - ATTRIBUTES
@NSManaged public var date: Date
// MARK: - RELATIONSHIPS
@NSManaged public var journal: Journal?
@NSManaged public var positions: Set<Position>?
}
public class Position: NSManagedObject, Identifiable {
// MARK: - RELATIONSHIPS
@NSManaged public var entry: Entry?
}
您将如何解决这个问题?请记住,在列出位置的视图上,该视图可以添加、删除和修改位置,因此解决方案应该允许 SwiftUI 在进行更改时重新加载视图并更新位置。
【问题讨论】:
-
我也有同样的问题。如果您找到解决方案,请发布答案。
-
你试过
ForEach(Array(entry?.positions))吗? -
@JoakimDanielson 非常简单。虽然可选需要强制展开,但令我惊讶的是,即使条目内没有位置,这也不会导致崩溃
ForEach(Array(entry.positions!))...副作用是数组每次更改时都会以随机顺序排列,所以这与符合 Comparable 协议的职位配对就像一个魅力。谢谢! -
您可以根据需要添加排序...
-
对,符合 Comparable 允许
ForEach(Array(entry.positions!).sorted())