2016-05-22 19 views
5

私は、Swift 2.2でiOS 8をターゲットとし、レルムを使用しているアプリを書いています。 Results.sorted(_:ascending:)を使用して、さまざまなオプションのプロパティに基づいてオブジェクトを並べ替えることができます。これは降順ソートではうまく動作しますが、昇順ソートの場合は、最初にnilという値が配置され、正しく表示されません。多くのデータベースシステムにはNULLS FIRST/LASTオプションがあり、CoreDataではsubclass NSSortDescriptorのように見えます。レルムで並べ替えるときにいつも最後にnil値を入れる方法はありますか?たとえハッキーな戦略しかないとしても、それは高く評価されます。レルムスウィフト:常に最後にnil値を並べ替えます

答えて

4

レルムは、Results.sorted(_:ascending:)メソッドが提供する以外のカスタムソートのResultsをサポートしていません。ほとんどの場合、私のデータソースがすでに持つことないので、私の場合は

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

、複数のクエリが困難だっただろう。しかし、あなたは多分、計算プロパティを使用していることを暴露する、2つのクエリを連結することで比較的簡単にこの自分を構成することができます他の並べ替えの優先順位と私は1つの状況でこのカスタムの並べ替えが必要です。数百から数千の結果が得られる可能性も非常に高いですが、結果を連結して記憶し続けるのではないでしょう。これは理想的ではないながら

だから、私が保存されstartDate: Date?hasStartDateプロパティを更新するカスタムセッターで計算プロパティdate: Date?によって自動的に更新されhasStartDate: Boolプロパティを保存することにしました。 hasStartDateもオブジェクトの初期化子に設定されています。

これは私が使用することができます:

realm.objects(SMItem.self).filter(predicate).sorted(by: [ 
    SortDescriptor(keyPath: "hasStartDate", ascending: false), 
    SortDescriptor(keyPath: "startDate", ascending: true) 
]) 

これはstartDateせずにオブジェクトが続くstartDate昇順、持つオブジェクトを返します。

関連する問題