У меня возникли проблемы с отображением моих базовых данных в SwiftUI из-за отношений между наборами. Каков наилучший способ отображения множества отношений внутри цикла SwiftUI ForEach?
Например, у меня есть две сущности в базовой дате: Entry & Position. Запись может содержать много позиций, и каждая позиция может принадлежать только одной записи.
У меня есть запись как переменная @binding в представлении, которое должно отображать позиции записи. В идеале я хотел бы получить доступ к позициям непосредственно из этой входной переменной, но поскольку позиции являются множеством, я получаю следующую ошибку:
Ошибка «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 перезагружать представление и обновлять позиции после внесения изменений.