RACObserve在NSMutableArray中更新值?

时间:2014-08-06 14:22:35

标签: ios objective-c reactive-cocoa

我对NSMutableArray中的值更改做出了反应。

我有以下(稍微简化)代码来检测更改:

[[RACObserve(self, postedImagesIds) filter:^BOOL(NSMutableArray * postedImagesIds) {
    return [postedImagesIds count] > 0;
}] subscribeNext:^(NSMutableArray * postedImagesIds) {
    [self uploadFields:fields];
}];

这里的想法是在uploadFields发生变化时致电NSMutableArray postedImagesIds。但不仅在添加新元素时,而且在更新值时也是如此:

[self.postedImagesIds replaceObjectAtIndex:i withObject:imagePosted.imagePostedId];

然后事情是,当值更新时,RACObserve永远不会知道!有没有办法认识到这种变化?

提前致谢!

1 个答案:

答案 0 :(得分:10)

可以这样做。重要的是你必须通过self上的KVC执行NSMutableArray变异,而不是对NSMutableArray对象的独立引用。换句话说,如果你这样做,它就不会起作用:

[self.postedImagesIds addObject:imagePosted.imagePostedId];
or
[self.postedImagesIds replaceObjectAtIndex:i withObject:imagePosted.imagePostedId];

相反,你必须像这样添加或替换对象:

NSMutableArray *fromKVC = [self mutableArrayValueForKey:@"postedImagesIds"];
[fromKVC addObject:imagePosted.imagePostedId];
or
[fromKVC replaceObjectAtIndex:i withObject:imagePosted.imagePostedId];

这是因为RACObserve()建立的KVO相对于您传入的对象作为其第一个参数(在本例中为self),因此只有通过观察到的KVC兼容突变对象将触发观察通知。