2015-10-20 16 views
5

IDの配列:[INT]があります。今度は、これらのIDを持つすべてのオブジェクトを選択したいが、ID配列のidの順序に従う必要がある。レルムとNSPredicateを使用して配列インデックスで並べ替え

let IDs = [2, 6, 3, 4, 10, 9] 
let predicate = NSPredicate(format: "id IN %@", IDs) 
let objects = realm.objects(Item.self).filter(predicate) 

しかし、結局、オブジェクトはIDの異なる方法で並べ替えられました。このオブジェクトを正しい順序で並べ替えることができる方法はありますか?

答えて

5

あなたはsort()を使用してそれを行うことができます。

レルムで
let IDs = [2, 6, 3, 4, 10, 9] 
let predicate = NSPredicate(format: "id IN %@", IDs)  
do { 
    let realm = try Realm() 
    let objects = realm.objects(Item).filter(predicate).sort({ IDs.indexOf($0.id) < IDs.indexOf($1.id) }) 
} catch {   
} 
+1

このアプローチは、並べ替え操作を実行するためのクエリに一致するすべての単一のオブジェクトのスウィフトクラスインスタンスを実体化します。この熱心なマテリアライゼーションを避けるには、 'Results.sorted(_ :)'を使用してください。ただし、Realmでサポートされていないカスタムソートアルゴリズムを適用する場合は、この方法が適しています(必要な場合もあります)。 – jpsim

+0

ありがとうございます。これは機能します。ただし、.sortを使用する前にすべてのオブジェクトを具体化する必要があります。 Results.sortedはID配列内のidの順序を検出することはできません。 – mashix

+0

質問はカスタムソートアルゴリズムを求めているので、オブジェクトをマテリアライズする方法はありません。 – joern

-1

Resultssorted(_:)メンバ関数を持っているRealmCollectionTypeプロトコルに準拠しています。この機能は、彼らは非常に使いやすい作り、StringLiteralConvertibleあるSortDescriptorsのシーケンスを、取ります

let realm = try! Realm() 
let IDs = [2, 6, 3, 4, 10, 9] 
let objects = realm.objects(Item).filter("id IN %@", IDs).sorted(["id"]) 
+0

私はsorted( "id")を使用しようとしましたが、必要なものではありません。私は配列IDでそのIDの順序でアイテムを注文したい。 – mashix

+2

私は参照してください。それでは、ジョーンの答えがこれを行うための最良の方法です。 – jpsim

関連する問題