Я использую модель CoreData, в которой групповой объект имеет GroupMembers (firstName: String), связанный с членами сущности. GroupMembers имеют соответствующую группу свойств, которая обратно подключается к объекту группы. В моем Detailview я передаю групповой объект. В FetchRequest я хочу отфильтровать всех членов группы, которые имеют ту же группу, что и моя переданная группа.
Я использую следующий код:
struct GroupDetailView: View {
@ObservedObject var group: Group
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \GroupMember.firstName_, ascending: true)],
predicate: NSPredicate(format: "group == %@", group),
animation: .default)
private var members: FetchedResults<GroupMember>
var body: some View {
}
}
Но я получаю следующую ошибку:
Cannot use instance member 'group' within property initializer; property initializers run before 'self' is available
У вас есть идеи, как я могу это исправить?
Отвечает ли это на ваш вопрос? Есть ли способ изменить полученные результаты с помощью предиката после их инициализации?
Вам действительно нужна группа как ObservedObject в этом представлении? Возможно, это может быть решено простым редизайном, например, написанием пользовательской инициализации, которая принимает группу в качестве аргумента и использует эту группу для создания предиката и назначения его запросу на выборку.
Или наоборот, вам вообще нужен запрос на выборку? Разве вы не можете получить все объекты GroupMember, используя атрибут отношения для Group -> GroupMember?
Я вижу, что на этот вопрос теперь есть принятый ответ, но теперь я убежден, что правильным решением является то, что я упомянул в своем предыдущем комментарии, пропустить запрос на выборку и вместо этого получить объекты из объекта Group.
Вот один из способов:
struct GroupDetailView: View {
private var fetchRequest: FetchRequest<GroupMember>
private var members: FetchedResults<GroupMember> {
fetchRequest.wrappedValue
}
init(group: Group) {
fetchRequest = FetchRequest(sortDescriptors: [SortDescriptor(\.firstName)], predicate: group.membersPredicate)
}
var body: some View {
}
}
Возможно, вы не видели, что запрос и результаты разделены таким образом, источником этой идеи является комментарий в заголовочном файле для @SectionedFetchRequest
.
Вам также необходимо добавить lazy var в расширение класса Group
, чтобы привязать к объекту NSPredicate
, чтобы его можно было повторно использовать, если это представление снова инициализируется. В редакторе моделей для Group
выберите только расширение класса. Затем в меню «Редактор» выберите «Создать подкласс NSManagedObject», выберите папку, в которой находятся быстрые файлы, и выберите цель приложения. Это делает оба файла, поэтому удалите расширение класса и сохраните класс. Возможно, вам придется очистить сборку несколько раз, чтобы она перестала использовать автоматически сгенерированный файл класса. Затем отредактируйте его следующим образом:
import Foundation
import CoreData
@objc(Group)
public class Group: NSManagedObject {
lazy var membersPredicate = {
NSPredicate(format: "group = %@", self)
}()
}
это происходит потому, что вы используете
group
перед его инициализацией, поэтому вы используете пустойGroup
объект в своемFetchRequest