SwiftUI、核心数据和搜索栏在更改谓词时冻结



我试图通过在搜索栏中键入谓词来过滤核心数据,但这样做会导致应用程序冻结。起初我以为问题出在搜索栏上,但经过几次测试后,我意识到当更改谓词时,应用程序会冻结。

为了说明发生了什么:你开始在栏中输入,结果就会显示出来,它们会随着你的输入而改变,这是正确的。当敲击";取消";在工具栏旁边,它有时运行良好,结果显示如预期,但大多数时候应用程序会冻结。

如果谓词完全相同,则应用程序不会冻结,工作正常,但事实并非如此。

这是导致问题的代码:

.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
}

最新更新