如何确保使用ReactiveCocoa始终对NSArray进行排序?

时间:2014-02-13 21:54:21

标签: objective-c reactive-cocoa

假设我有一个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的更改并在那里执行排序?到目前为止,我尝试这样做会导致无限循环。

2 个答案:

答案 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:)];
}