2015-10-20 112 views
5

我有一个ID数组:[INT]。现在我想选择所有具有这些ID的对象,但需要按照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) 

但最后,对象以不同的方式与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之前,我们需要实现所有对象。虽然结果.sorted不能检测ID数组中的ID的顺序。 – mashix

+0

这个问题需要一个自定义排序算法,所以没有办法实现对象。 – joern

-1

在境界,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”),但它不是我所需要的。我想按照ID在数组ID中的顺序来排序项目。 – mashix

+2

我明白了。然后,乔恩的答案是现在做这件事的最好方法。 – jpsim