2015-10-20 26 views
5

Mam tablicę identyfikatorów: [INT]. Teraz chcę zaznaczyć, że wszystkie obiekty mają te identyfikatory, ale muszą podążać za kolejnością id w tablicy ID.Sortowanie według indeksu tablicy za pomocą Realm i NSPredicate

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

Ale w końcu obiekty zostały zamówione w inny sposób za pomocą identyfikatorów. Czy istnieje sposób, w jaki mogę uporządkować te obiekty we właściwej kolejności?

Odpowiedz

5

Można to zrobić za pomocą 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

Takie podejście będzie zmaterializować Swift instancje klasy każdego pojedynczego obiektu pasujących do zapytania, aby wykonać operację sortowania. Użyj 'Results.sorted (_ :)', aby uniknąć tej intensywnej materializacji. To podejście jest jednak dobre (konieczne nawet) do zastosowania niestandardowego algorytmu sortowania nieobsługiwanego przez Realm. – jpsim

+0

Dzięki. To działa. Jednak przed użyciem .sort musimy zmaterializować wszystkie obiekty. Results.sorted nie jest w stanie wykryć kolejności id w tablicy ID. – mashix

+0

Pytanie o niestandardowy algorytm sortowania, więc nie ma możliwości zmaterializowania obiektów. – joern

-1

W Królestwie Results zgodny z protokołem RealmCollectionType, który posiada funkcję sorted(_:) użytkownika. Ta funkcja wykonuje sekwencję SortDescriptors, które są StringLiteralConvertible, co czyni je bardzo łatwy w użyciu:

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

Próbowałem użyć posortowane ("id"), ale to nie jest to, czego potrzebuję. Chcę zamówić elementy według kolejności ich identyfikatorów w identyfikatorach tablic. – mashix

+2

Rozumiem. Odpowiedź Johna jest najlepszym sposobem na zrobienie tego na razie. – jpsim

Powiązane problemy