Не могу наблюдать дополнения 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;