如何按列表对Realm结果顺序进行排序?

时间:2015-12-22 08:13:50

标签: ios objective-c realm

我通过列表属性“index”获取名为“DictObj”的Realm对象,如下所示:

NSArray *listIDs = @[@1000,@0,@100,@4];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"index IN %@",listIDs];
self.fetchedResults = [DictObj objectsInRealm:realm withPredicate:predicate];

我只是获取结果,但它按主键“index”自动排序,我希望按“listIDs”保持顺序。所以我创建sortDescriptor并尝试自定义排序,如下所示,但它崩溃了错误:“由于未捕获的异常终止应用程序'NSInvalidArgumentException',原因:' - [NSSortDescriptor属性]:无法识别的选择器发送到实例0x”

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"index" ascending:NO comparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    NSNumber *num1 = [NSNumber numberWithInteger:(NSInteger)obj1];
    NSNumber *num2 = [NSNumber numberWithInteger:(NSInteger)obj2];
    NSInteger listIndex1 = [listIDs indexOfObject:num1];
    NSInteger listIndex2 = [listIDs indexOfObject:num2];

    return listIndex1 < listIndex2;
}];
self.fetchedResults = [[DictObj objectsInRealm:realm withPredicate:predicate] sortedResultsUsingDescriptors:@[sortDescriptor]];

//Model
@interface DictObj : RLMObject
@property NSInteger index;
@property NSString *name;
@end

如何根据Realm中的列表自定义排序结果顺序?

1 个答案:

答案 0 :(得分:4)

-[RLMResults sortedResultsUsingDescriptors:]需要NSArray<RLMSortDescriptor *>。在您的代码中,您传递的是NSArray<NSSortDescriptor *>RLMSortDescriptorNSSortDescriptor是具有不同接口的不同类,因此您将看到异常。

目前RLMResults只能按属性值直接排序。为了对计算出的排序进行排序,就像您需要使用NSArray的内容填充RLMResults之后,对其进行排序。在RLMResults上添加对此的支持,正在Realm的GitHub存储库的issue #1265中进行跟踪。