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' 可用之前”。我该如何解决这个问题?
您可以将要在提取中使用的参数提供给 View
的 init
,如下所示:
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,每次初始化此视图时都会调用主体函数,即使没有任何更改,因此你可能希望将其包装在另一个 View
以 folder
作为保护层的 let。
@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' 可用之前”。我该如何解决这个问题?
您可以将要在提取中使用的参数提供给 View
的 init
,如下所示:
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,每次初始化此视图时都会调用主体函数,即使没有任何更改,因此你可能希望将其包装在另一个 View
以 folder
作为保护层的 let。