如何使用 属性 对 RLMArray 进行排序?
How to sort RLMArray using property?
我正在尝试使用其 属性 对 RLMArray 进行排序,但出现错误:
This method may only be called on RLMArray instances retrieved from an
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
我的习惯 class 是
#import <Realm/Realm.h>
@interface MyWidgetSet : RLMObject
@property NSString *widgetName;
@property NSString *orderNum;
@end
我找到了 2 年前发布的类似 question。我希望使用 Realm 2.1.2
为这个 issue.I 提供更新的解决方案
目前我正在使用 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];
在报错信息中可以看到,sortedResultsUsingProperty
方法只能用于查询得到的对象。您应该先将对象保存到 Realm。这是对性能排序 RLMArray
的最佳方式。
或者如果你想排序 RLMArray
还没有保存到 Realm,你可以使用 NSArray
。所以你所做的是正确的。唯一的就是把RLMArray
转换成NSArray
可以写的更简单。只需使用valueForKey:@"self"
,不需要遍历所有元素。
NSArray *tempLog = [myLog.myRLMArray valueForKey:@"self"];
...
我正在尝试使用其 属性 对 RLMArray 进行排序,但出现错误:
This method may only be called on RLMArray instances retrieved from an 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
我的习惯 class 是
#import <Realm/Realm.h>
@interface MyWidgetSet : RLMObject
@property NSString *widgetName;
@property NSString *orderNum;
@end
我找到了 2 年前发布的类似 question。我希望使用 Realm 2.1.2
为这个 issue.I 提供更新的解决方案目前我正在使用 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];
在报错信息中可以看到,sortedResultsUsingProperty
方法只能用于查询得到的对象。您应该先将对象保存到 Realm。这是对性能排序 RLMArray
的最佳方式。
或者如果你想排序 RLMArray
还没有保存到 Realm,你可以使用 NSArray
。所以你所做的是正确的。唯一的就是把RLMArray
转换成NSArray
可以写的更简单。只需使用valueForKey:@"self"
,不需要遍历所有元素。
NSArray *tempLog = [myLog.myRLMArray valueForKey:@"self"];
...