如何使用@FetchRequest以更简单的方式过滤核心数据条目



我有一个名为Car的实体。

我有这个@FetchRequest来列出汽车。

@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: Car.name, ascending: true)],
animation: .default)
var dishes: FetchedResults<Car>

这个效果很好,但是现在我想在视图中添加一个搜索栏。

我知道@FetchRequest有这样的语法
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: Car.name, ascending: true)],
predicate: // WTH I put here?,
animation: .default)
var dishes: FetchedResults<Dish>

我尝试创建一个名为buildPredicate的函数,如下所示:

func buildPredicate() -> NSPredicate {
if searchText == "" {
return NSPredicate(value: true)
}

return NSPredicate(format: "name CONTAINS[cd] %@", searchText)
}

但是这将不起作用,因为要运行这个函数,我需要首先创建self,而XCode正在编译代码时,self尚未创建。

对于计算的变量也是如此。

我知道有一种方法,你需要是一个火箭科学家才能使用,我以前用过,使用像这样的东西

struct FetchedObjects<T, Content>: View where T : NSManagedObject, Content : View {

let content: ([T]) -> Content
var request: FetchRequest<T>
var results: FetchedResults<T>{ request.wrappedValue }

// MARK: - Lifecycle

init(
predicate: NSPredicate = NSPredicate(value: true),
sortDescriptors: [NSSortDescriptor] = [],
@ViewBuilder content: @escaping ([T]) -> Content
) {
self.content = content
self.request = FetchRequest(
entity: T.entity(),
sortDescriptors: sortDescriptors,
predicate: predicate
)
}

而不是FetchRequest,但我想知道是否有一个更简单的方法。

是否有一种方法可以为@FetchRequest构建一个谓词?

使用.onChange(of:)作为搜索文本变量来构建谓词并更新获取请求

.onChange(of: searchText) { search in
if search.isEmpty {
dishes.predicate = NSPredicate(value: true)
} else {
dishes.predicate = NSPredicate(format: "name CONTAINS[cd] %@", search)
}
}

最新更新