无法使用ReactiveCocoa观察NSMutableSet添加

时间:2014-04-16 22:10:39

标签: ios objective-c reactive-cocoa nsmutableset

我有一个名为selectedEmails的NSMutableSet属性的简单视图控制器。在viewDidLoad中,我创建了空集并订阅了更改:

self.selectedEmails = [NSMutableSet set];
[RACObserve(self, selectedEmails) subscribeNext:^(id emails) {
  NSLog(@"set: %@", emails);
}];

出于调试目的,我将一个项目添加到viewDidAppear:中的集合中。但是,订阅块仅针对初始空集触发一次,而从不针对新的更新集触发。

这是为什么?我该如何修复它以便观察变化?我在the answer to a different question中看到你无法观察到一组,但只有包含它的类 - 这是否意味着ReactiveCocoa不会在集合上工作?

1 个答案:

答案 0 :(得分:1)

我想象你没有收到通知,因为你正在观察指向选定电子邮件的指针,就ReactiveCocoa而言,这个值没有改变。该位置包含的信息已更改(即对象已变异),但指针本身仍引用同一对象。

没有"即插即用"解决您正在尝试做的事情。除了answer you linkedthe 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;