我试图通过在搜索栏中键入谓词来过滤核心数据,但这样做会导致应用程序冻结。起初我以为问题出在搜索栏上,但经过几次测试后,我意识到当更改谓词时,应用程序会冻结。
为了说明发生了什么:你开始在栏中输入,结果就会显示出来,它们会随着你的输入而改变,这是正确的。当敲击";取消";在工具栏旁边,它有时运行良好,结果显示如预期,但大多数时候应用程序会冻结。
如果谓词完全相同,则应用程序不会冻结,工作正常,但事实并非如此。
这是导致问题的代码:
.searchable(text: $searchText)
.onChange(of: searchText) { searchText in
if !searchText.isEmpty {
data.nsPredicate = NSPredicate(format: "business == %@ && title CONTAINS[cd] %@" , business, searchText)
} else {
data.nsPredicate = NSPredicate(format: "business == %@", business)
}
}
这段代码虽然有点傻,但它表明,如果我不更改谓词,问题就不会出现。
.searchable(text: $searchText)
.onChange(of: searchText) { searchText in
if !searchText.isEmpty {
data.nsPredicate = NSPredicate(format: "business == %@ && title CONTAINS[cd] %@" , business, searchText)
} else {
data.nsPredicate = NSPredicate(format: "business == %@ && title CONTAINS[cd] %@" , business, searchText)
}
}
当冻结发生时,不会显示任何错误,只是冻结,它发生在模拟器和真实设备上。
有什么想法吗?谢谢
工作代码:
最后得到了一个解决方案,由lorem ipsum评论。
@State private var searchText = ""
var query: Binding<String> {
Binding {
searchText
} set: { newValue in
searchText = newValue
datos.nsPredicate = newValue.isEmpty
? NSPredicate(format: "business == %@", business)
: NSPredicate(format: "business == %@ && title CONTAINS[cd] %@" , business, newValue)
}
}
var body: some View {
..........
..........
.searchable(text: query)
}
来源:苹果设置
您需要删除onChange并将搜索文本传递到创建FetchRequest的视图中,例如
SearchView(searchText)
private var fetchRequest: FetchRequest<Item>
private var items: FetchedResults<Item> {
fetchRequest.wrappedValue
}
init(_ searchText: String) {
fetchRequest = FetchRequest( // supply a NSPredicate using searchText
}