如何使用属性对RLMArray进行排序?

时间:2016-12-28 16:21:25

标签: objective-c realm rlmarray

我正在尝试使用其属性对RLMArray进行排序,但我收到错误:

  

此方法只能在从中检索的RLMArray实例上调用   RLMRealm`

 RLMResults *rlmResults  =  [myLog.myRLMArray sortedResultsUsingProperty:@"orderNum" ascending:YES];

此处myLog.myRLMArray是我从RLMRealm获得的数据副本。

myLog声明为:

 RLM_ARRAY_TYPE(MyWidgetSet)
@interface MYLogObject : RLMObject
@property RLMArray< MyWidgetSet *>< MyWidgetSet > *myRLMArray;
@end

我的自定义类是

#import <Realm/Realm.h>

@interface MyWidgetSet : RLMObject
@property NSString *widgetName;
@property NSString *orderNum;
@end

我发现了2年前发布的类似question。我希望有一个针对这个问题的更新解决方案。我正在使用Realm 2.1.2

2 个答案:

答案 0 :(得分:2)

正如您在错误消息中看到的那样,sortedResultsUsingProperty方法只能用于查询获取的对象。您应该首先将对象保存到Realm。这是为表演排序RLMArray的最佳方式。

或者,如果您想对尚未保存到Realm的RLMArray进行排序,则可以使用NSArray。所以你所做的是正确的。唯一可以将RLMArray转换为NSArray的内容更简单。只需使用valueForKey:@"self",您就不需要迭代所有元素。

NSArray *tempLog = [myLog.myRLMArray valueForKey:@"self"];
...

答案 1 :(得分:1)

目前我正在使用NSArray对数据进行排序。我希望有人会想出一个更好的方法直接使用RLMArray

NSMutableArray *tempLog = [NSMutableArray array];
for (MyWidgetSet *tempSet in myLog.myRLMArray){
    [tempLog addObject:tempSet];
}

并使用sortedArrayUsingComparator

排序
 NSArray *tempWelLogCopy = [tempLog sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

        if ([[obj1 valueForKey:@"orderNum"] integerValue] > [[obj2 valueForKey:@"orderNum"] integerValue]) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        if ([[obj1 valueForKey:@"orderNum"] integerValue] < [[obj2 valueForKey:@"orderNum"] integerValue]) {
            return (NSComparisonResult)NSOrderedAscending;
        }
        return (NSComparisonResult)NSOrderedSame;
    }];

并将已排序的数据添加回RLMArray

    [myLog.myRLMArray removeAllObjects];
    [myLog.myRLMArray addObjects:tempWelLogCopy];