SwiftUI:按关系过滤核心数据获取(NSPredicate)

SwiftUI: Filter Core Data fetch by relationship (NSPredicate)

@Environment(\.managedObjectContext) private var viewContext

@FetchRequest(
    entity: ListStruct.entity(),
    sortDescriptors: [NSSortDescriptor(keyPath: \ListStruct.name, ascending: true)],
    predicate: NSPredicate(format: "parentfolder == %@", parentFolder),
    animation: .default)
private var lists: FetchedResults<ListStruct>

var parentFolder: FolderStruct

有两个实体:FolderStruct 和 ListStruct。我用两个实体制作了一个树结构。我正在使用此代码的视图接收“var parentFolder: FolderStruct”作为参数。

FolderStruct和ListStruct是一对多的关系,即一个folderStruct可以容纳多个ListStruct。 FolderStruct 有一个名为“childlists”的关系,它是一对多的,而 ListStruct 有一个名为“parentfolder”的关系,它是一对一的。

在获取ListStructs时,我想过滤父文件夹关系为参数parentFolder的ListStructs。但是,上面的代码会出错,提示“无法在 属性 初始值设定项中使用实例成员 'parentFolder';属性 初始值设定项 运行 在 'self' 可用之前”。我该如何解决这个问题?

您可以将要在提取中使用的参数提供给 Viewinit,如下所示:

private var fetchRequest : FetchRequest<Item>
private var items: FetchedResults<Item> {
    fetchRequest.wrappedValue
}

init(folder: Folder) {
    fetchRequest = FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Item.name, ascending: true)],
    predicate: NSPredicate(format: "folder == %@", folder),
    animation: .default)
}

正如你所知,由于 bug in FetchRequest,每次初始化此视图时都会调用主体函数,即使没有任何更改,因此你可能希望将其包装在另一个 Viewfolder 作为保护层的 let。