Не могу наблюдать дополнения NSMutableSet с ReactiveCocoa

У меня есть простой контроллер представления со свойством NSMutableSet под названием selectedEmails, В viewDidLoad Я создаю пустой набор и подписываюсь на изменения:

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

В целях отладки я добавляю элемент в набор viewDidAppear:, Тем не менее, блок подписки срабатывает только один раз, для начального пустого набора, и никогда для нового, обновленного набора.

Почему это? Как я могу это исправить, чтобы я мог наблюдать за изменениями? В ответе на другой вопрос я вижу, что вы не можете наблюдать набор, а только класс, который его содержит - означает ли это, что ReactiveCocoa не будет работать на наборах?

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;
Другие вопросы по тегам