2015-10-20 3 views
5

У меня есть массив идентификаторов: [INT]. Теперь я хочу, чтобы все объекты имели эти идентификаторы, но должны следовать порядку id в массиве ID.Сортировка по индексу массива с использованием Realm и NSPredicate

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

Но, в конце концов, объекты были заказаны по-другому с идентификаторами. Есть ли способ сортировки этих объектов в правильном порядке?

ответ

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

Этот подход будет материализовать экземпляры Swift класса каждого отдельного объекта, соответствующие запросу для выполнения операции сортировки. Используйте 'Results.sorted (_ :)', чтобы избежать этой нетерпеливой материализации. Однако этот подход хорош (необходим даже) для применения алгоритма пользовательской сортировки, не поддерживаемого Realm. – jpsim

+0

Спасибо. Это работает. Однако нам нужно будет материализовать все объекты перед использованием .sort. Результаты.sorted не способны обнаруживать порядок id в массиве ID. – mashix

+0

Вопрос задан для пользовательского алгоритма сортировки, поэтому материализации объектов нет. – joern

-1

В Realm, Results соответствует протоколу RealmCollectionType, который имеет функцию в sorted(_:) члена. Эта функция принимает последовательность SortDescriptors, которые являются StringLiteralConvertible, что делает их очень проста в использовании:

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

Я попытался использовать отсортированный («id»), но это не то, что мне нужно. Я хочу заказать элементы по порядку их идентификатора в идентификаторах массива. – mashix

+2

Я вижу. Тогда ответ Джорнна - лучший способ сделать это сейчас. – jpsim

Смежные вопросы