2015-10-20 6 views
5

Ich habe ein Array von IDs: [INT]. Jetzt möchte ich auswählen, dass alle Objekte diese IDs haben, aber müssen die Reihenfolge der ID im IDs-Array folgen.Sortieren nach Array-Index mit Realm und NSPredate

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

Aber am Ende wurden Objekte auf andere Weise mit IDs sortiert. Gibt es eine Möglichkeit, dass ich diese Objekte in die richtige Reihenfolge sortieren kann?

Antwort

5

Sie können es sort() mit tun:

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

Dieser Ansatz Swift Klasseninstanzen jedes einzelnen Objekts materialisieren wird die Abfrage Anpassung der Sortiervorgang auszuführen. Verwenden Sie 'Results.sorted (_ :)', um diese eifrige Materialisierung zu vermeiden. Dieser Ansatz ist gut (sogar notwendig), um einen benutzerdefinierten Sortieralgorithmus anzuwenden, der jedoch nicht von Realm unterstützt wird. – jpsim

+0

Danke. Das funktioniert. Bevor wir .sort verwenden, müssen wir jedoch alle Objekte materialisieren. Results.sorted kann die ID-Reihenfolge im IDs-Array jedoch nicht erkennen. – mashix

+0

Die Frage wurde nach einem benutzerdefinierten Sortieralgorithmus gestellt, so dass es keine Möglichkeit gibt, die Objekte zu materialisieren. – joern

-1

In Realm, Results entspricht dem RealmCollectionType-Protokoll, das eine sorted(_:) Memberfunktion hat. Diese Funktion nimmt eine Folge von SortDescriptors, die StringLiteralConvertible sind, so dass sie recht einfach zu bedienen:

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

Ich habe versucht, sortierte ("ID") zu verwenden, aber es ist nicht das, was ich brauche. Ich möchte Artikel in der Reihenfolge ihrer ID in Array-IDs bestellen. – mashix

+2

Ich sehe. Dann ist joerns Antwort der beste Weg, dies jetzt zu tun. – jpsim

Verwandte Themen