假设我有一个ColorListViewModel,其模型是Color对象的数组:
@property (nonatomic, copy) NSArray *colors;
我在执行命令时更新整个模型:
RAC(self, colors) = [_fetchColorsCommand.executionSignals flatten];
同时还有addColor:
方法执行以下操作:
- (void)addColor:(Color *)color
{
NSMutableArray *mutableColors = [self.colors mutablecopy];
[mutableColors addObject:color];
self.colors = [mutableColors copy];
}
我可以使用NSSortDescriptor在多个位置对颜色数组(例如,按名称)进行排序。
如何订阅self.colors
的更改并在那里执行排序?到目前为止,我尝试这样做会导致无限循环。
答案 0 :(得分:1)
distinctUntilChanged
似乎是我所缺少的,以防止无限循环。
[[RACObserve(self, colors) distinctUntilChanged] subscribeNext:^(NSArray *colors) {
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
self.colors = [colors sortedArrayUsingDescriptors:@[sortDescriptor]];
}];
这似乎有效,虽然我此时并未发现任何警告。
答案 1 :(得分:0)
这取决于你是否进行更多插入或更多阅读...
如果你做了很多插入而不是很多阅读,那么你可以懒散地排序......
这两个示例都要求您定义-(NSComparisonResult)compareColor:(id)someOtherColor
...
你也可以使用一个块或函数。
- (NSArray *)colors
{
return [_colors sortedArrayUsingSelector:@selector(compareColor:) ];
}
或者你可以在插入时排序,如果你经常阅读
- (void)addColor:(Color *)color
{
NSMutableArray *mutableColors = [self.colors mutablecopy];
[mutableColors addObject:color];
self.colors = [mutableColors sortedArrayUsingSelector:@selector(compareColor:)];
}