Realm Swift:总是将nil值排在最后

时间:2016-05-22 11:59:03

标签: swift realm

我正在使用面向iOS 8并使用Realm的Swift 2.2中编写应用程序。我允许用户使用Results.sorted(_:ascending:)基于各种可选属性对对象进行排序。这适用于降序排序,但对于升序排序,nil值首先放置,看起来不正确。许多数据库系统都有NULLS FIRST/LAST选项,而使用CoreData,看起来可能subclass NSSortDescriptor。在Realm中排序时,有没有办法始终将nil值放在最后?即使只有一个hacky策略,也会受到赞赏。

2 个答案:

答案 0 :(得分:5)

除了Results方法提供的内容之外,

Realm不支持Results.sorted(_:ascending:)的自定义排序。但是你可以通过连接两个查询来相当容易地编写它,甚至可以通过计算属性公开它:

var results: [MyModel] {
  let sorted = realm.objects(MyModel).sorted("...", ascending: true)
  return sorted.filter("optionalProperty != nil") +
         sorted.filter("optionalProperty == nil")
}

答案 1 :(得分:0)

在我的情况下,多个查询会很困难,因为在大多数情况下,我的数据源已经与其他排序优先级一起执行,我只需要在一种情况下进行自定义nil排序。它也很可能有数百或数千个结果,我宁愿不通过连接结果保留在内存中。

因此,虽然这不理想,但我选择存储hasStartDate: Bool属性,该属性由计算属性date: Date?自动更新,并使用自定义setter更新存储的startDate: Date?和{{ 1}}属性。 hasStartDate也在我的对象的初始值设定项中设置。

这允许我使用:

hasStartDate

这将返回realm.objects(SMItem.self).filter(predicate).sorted(by: [ SortDescriptor(keyPath: "hasStartDate", ascending: false), SortDescriptor(keyPath: "startDate", ascending: true) ]) 升序的对象,后跟没有startDate的对象。