我对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
永远不会知道!有没有办法认识到这种变化?
提前致谢!
答案 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兼容突变对象将触发观察通知。