Как подписаться на добавление и удаление объектов из NSMutableDictionary с помощью ReactiveCocoa? Кроме того, я хотел бы транслировать уведомление, когда оно изменится. Я предполагаю, что вещание можно осуществлять с помощью RACMulticastConnection, но как связать это с изменением словаря? Я пытаюсь использовать ReactiveCocoa впервые в своем проекте и застрял на первом, что хотел сделать :(
Реактивный NSmutableDictionary?
Ответы (2)
RACObserve
— это оболочка вокруг отслеживания значений ключей и наследует те же черты и недостатки.
К сожалению, NSMutableDictionary
нельзя наблюдать автоматически. Есть два способа обойти это:
- Подкласс и добавьте поддержку KVO.
- Создайте реальный объект модели со свойствами вместо ключей словаря. Затем вы получите KVO для этих свойств, если вы используете сеттеры вместо прямой модификации ivar.
Я не уверен, что именно вы подразумеваете под «[транслировать] уведомление, когда оно изменяется», или почему это было бы полезно. Уведомления слишком глобальны, на мой вкус, и вместо этого я бы рекомендовал использовать более ограниченное наблюдение (например, KVO).
Однако, предполагая, что вы определенно хотите это сделать, достаточно просто опубликовать уведомление в ответ на новое значение сигнала:
@weakify(self);
[RACObserve(self, dictionary) subscribeNext:^(NSDictionary *dictionaryValue) {
@strongify(self);
[NSNotificationCenter.defaultCenter postNotificationName:SomeNotificationName object:self];
}];
Если вам нужен словарь изменений KVO (который включает информацию о добавленных/удаленных значениях), вам нужно заменить RACObserve
на +rac_valuesAndChangesForKeyPath:options:observer:.
каждый раз, когда вы устанавливаете или удаляете ключ-значение, сбрасывайте диктовку, чтобы вы могли наблюдать за диктовкой. как:
[RACObserve(self, testDict) subscribeNext:^(id x) {
NSLog(@"RACObserve testDict:%@",x);
}];
[self.testDict setObject:value forKey:key];
self.testDict=self.testDict;