我有一个名为selectedEmails
的NSMutableSet属性的简单视图控制器。在viewDidLoad
中,我创建了空集并订阅了更改:
self.selectedEmails = [NSMutableSet set];
[RACObserve(self, selectedEmails) subscribeNext:^(id emails) {
NSLog(@"set: %@", emails);
}];
出于调试目的,我将一个项目添加到viewDidAppear:
中的集合中。但是,订阅块仅针对初始空集触发一次,而从不针对新的更新集触发。
这是为什么?我该如何修复它以便观察变化?我在the answer to a different question中看到你无法观察到一组,但只有包含它的类 - 这是否意味着ReactiveCocoa不会在集合上工作?
答案 0 :(得分:1)
我想象你没有收到通知,因为你正在观察指向选定电子邮件的指针,就ReactiveCocoa而言,这个值没有改变。该位置包含的信息已更改(即对象已变异),但指针本身仍引用同一对象。
没有"即插即用"解决您正在尝试做的事情。除了answer you linked和the one in the comments above中提出的方法之外,您还可以采用更加洞穴式的方法,而不是使用可变集,使用常规集并在每当您创建新对象时想要改变一下。
请注意,这是一种繁琐的方法,并且非常容易出现人为错误,所以您应该赞成提到的其他方法之一。
@property NSSet* selectedEmails;
// Create it
self.selectedEmails = [NSSet set];
// Add to it
self.selectedEmails = [self.selectedEmails setByAddingObject:someObject];
// Remove from it
NSMutableSet* mutableCopy = [self.selectedEmails mutableCopy]:
[mutableCopy removeObject:someObject];
self.selectedEmails = mutableCopy;