1

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

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

出于调试目的,我随后将一个项目添加到viewDidAppear:. 但是,订阅块只会触发一次,对于初始的空集,而不会触发新的更新集。

为什么是这样?如何修复它以便观察变化?我在另一个问题的答案中看到,您不能观察集合,而只能观察包含它的类——这是否意味着 ReactiveCocoa 不能在集合上工作?

4

1 回答 1

1

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

对于您正在尝试做的事情,没有“即插即用”的解决方案。除了您链接的答案中提出的方法和上面评论中提出的方法之外,您还可以采用更原始的方法,而不是使用可变集,而是使用常规集并在需要时创建一个新对象更改设置。

请注意,这是一种繁琐的方法,并且很容易出现人为错误,因此您可能应该更喜欢提到的其他方法之一。

@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;
于 2014-04-16T22:41:53.073 回答