SwiftUI中的@FetchRequest属性包装器排序
2023-09-12 21:20:01
简介
当你使用 SwiftUI 的 @FetchRequest
属性包装器从 Core Data 中提取对象时,你需要指定你希望的数据排序方式 —— 它们是应该以某个字段的字母表顺序排序呢?还是以某个数字的大小来排序?如果我们指定空的数组,对于少量的对象可能还能工作,但是一旦超过 20 个对象,我们就会看到随机的排序结果。那是因为 Apple 不希望对未经排序的对象进行迭代,因为这可能会导致性能问题。
字符串类型排序
为了对字符串类型的数据进行排序,我们可以使用 NSSortDescriptor(key:, ascending:)
初始化器来创建一个 NSSortDescriptor
实例,其中 key
是要排序的属性的名称,ascending
是一个布尔值,表示数据是应该按升序还是降序排列。
@FetchRequest(
sortDescriptors: [NSSortDescriptor(key: "name", ascending: true)]
)
var books: FetchedResults<Book>
在这个例子中,我们告诉 SwiftUI 按图书的名称对图书进行排序,按升序排列。这意味着名称以 "A" 开头的图书将排在名称以 "B" 开头的图书之前。
数字类型排序
对于数字类型的数据,我们可以使用 NSSortDescriptor(key:, ascending:, selector:)
初始化器来创建一个 NSSortDescriptor
实例,其中 selector
是一个选择器,指定用于比较数据的比较函数。
@FetchRequest(
sortDescriptors: [NSSortDescriptor(key: "price", ascending: false, selector: #selector(NSNumber.compare(_:)))]
)
var books: FetchedResults<Book>
在这个例子中,我们告诉 SwiftUI 按图书的价格对图书进行排序,按降序排列。这意味着价格较高的图书将排在价格较低的图书之前。
复合排序
我们还可以将多个 NSSortDescriptor
实例组合成一个数组,以对数据进行复合排序。这允许我们根据多个字段对数据进行排序,例如,我们可以先按图书的名称对图书进行排序,然后按价格对图书进行排序。
@FetchRequest(
sortDescriptors: [
NSSortDescriptor(key: "name", ascending: true),
NSSortDescriptor(key: "price", ascending: false, selector: #selector(NSNumber.compare(_:)))]
)
var books: FetchedResults<Book>
在这个例子中,我们将按名称对图书进行升序排序,然后按价格对图书进行降序排序。这意味着名称以 "A" 开头的图书将排在名称以 "B" 开头的图书之前,而价格较高的图书将排在价格较低的图书之前。
结束语
NSSortDescriptor
是一个非常强大的工具,可用于对 Core Data 中的数据进行排序。通过使用 NSSortDescriptor
,我们可以轻松地对数据进行升序或降序排序,还可以根据多个字段对数据进行复合排序。