Реактивный NSmutableDictionary?

Как подписаться на добавление и удаление объектов из NSMutableDictionary с помощью ReactiveCocoa? Кроме того, я хотел бы транслировать уведомление, когда оно изменится. Я предполагаю, что вещание можно осуществлять с помощью RACMulticastConnection, но как связать это с изменением словаря? Я пытаюсь использовать ReactiveCocoa впервые в своем проекте и застрял на первом, что хотел сделать :(


person ashokgelal    schedule 06.10.2013    source источник


Ответы (2)


RACObserve — это оболочка вокруг отслеживания значений ключей и наследует те же черты и недостатки.

К сожалению, NSMutableDictionary нельзя наблюдать автоматически. Есть два способа обойти это:

  1. Подкласс и добавьте поддержку KVO.
  2. Создайте реальный объект модели со свойствами вместо ключей словаря. Затем вы получите 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:.

person Justin Spahr-Summers    schedule 07.10.2013
comment
Спасибо! В итоге я использовал реальный объект модели. Вопрос о трансляции был больше связан с любопытством, чем с чем-либо еще. Мне нужна глобальная трансляция, и в итоге я использовал NSNotificationCenter. Что касается наблюдения, я использую addObserverForName:object:queue:usingBlock: С другой стороны, мне действительно кажется, что документации по ReactiveCocoa не хватает. Кто-то должен написать об этом книгу. Наверное сами создатели библиотеки :) - person ashokgelal; 07.10.2013
comment
@ cod3-monk-3y Вы проверили заголовки? Каждый метод и класс подробно документированы. Также есть целая папка Documentation, в которой объясняется множество вещей более высокого уровня. - person Justin Spahr-Summers; 07.10.2013
comment
У меня есть, и, честно говоря, они действительно хороши. Но они тоже отключены. Они хорошо объясняют, что они из себя представляют, но не объясняют, как их использовать или как две разные вещи вместе решают проблему. Чтобы стать лучше, я прошел .net ReactiveExtensions, а также, как вы где-то предложили, язык программирования elm. Но я думаю, что миру нужны лучшие/настоящие примеры ReactiveCocoa. Большинство из них просто показывают, как связать текстовое поле или кнопку. Мне очень понравился вот этот: stackoverflow.com/a/14072445/33203 Серьезно! - мои 2 цента - person ashokgelal; 07.10.2013
comment
Кроме того, GHAPIDemo также является отличным ресурсом для начинающих. github.com/ReactiveCocoa/GHAPIDemo - person ashokgelal; 07.10.2013
comment
Ссылка на GHAPIDemo не работает. - person fatuhoku; 03.02.2015

каждый раз, когда вы устанавливаете или удаляете ключ-значение, сбрасывайте диктовку, чтобы вы могли наблюдать за диктовкой. как:

 [RACObserve(self, testDict) subscribeNext:^(id x) {
     NSLog(@"RACObserve testDict:%@",x);
 }];

[self.testDict setObject:value forKey:key];
self.testDict=self.testDict;
person user3044484    schedule 27.05.2015