2015-12-22 146 views
4

我取名叫“DictObj”境界对象的财产目录“指数”是这样的:如何按列表对Realm结果顺序进行排序?

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

我只是取的结果,但它通过主键“指数”自动顺序,我想通过“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中的列表排序结果顺序?

回答

4

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

目前RLMResults只能通过属性值直接排序。为了对计算顺序进行排序,就像您需要填写NSArrayRLMResults的内容一样,然后对其进行排序。在Realm的GitHub存储库上的issue #1265中追踪RLMResults上的支持。

+1

谢谢!当它仅支持按属性排序时非常难过。我希望它会很快更新,至少在“IN列表”的情况下保持秩序。 –

相关问题