Почему RACObserve не работает с RACSubject?

У меня есть пара мест в моем коде, где вместо обычного RACSignal используется RACSubject - обычно это просто для уведомлений о событиях с нулевыми данными. В любом случае, одна вещь, которая озадачила меня на этом пути, - это попытка использовать стандартный объект "RACObserve - subscribeNext" на предмете и заметить, что события не запускают блок.

Пример использования RACObserve & subscribeNext, аналогично тому, как это делается с большинством стандартных RACSignals:

self.subjectOne = [RACSubject subject];

[RACObserve(self, subjectOne) subscribeNext:^(NSString * x) {
    NSLog(@"subjectOne: %@", x);
}];

[self.subjectOne sendNext:@"foo"];
[self.subjectOne sendNext:@"bar"];

приводит к следующему выводу:

subjectOne: <RACSubject: 0x600000025700> name:

Почему это вместо двух событий?

ПРИМЕЧАНИЕ: это было сделано с использованием ReactiveCocoa 2.x

1 ответ

Проблема с использованием RACObserve для RACSubject заключается в том, что это макрос для rac_valuesForKeyPath, и, поскольку мы не видим фактическое свойство, которое мы наблюдаем, мы просто видим, как распечатывается начальный побочный эффект, и ничего больше. Если вы остановитесь на побочном эффекте и загляните в свойство "подписчиков" subjectOne, вы заметите, что у него даже нет подписчиков.

Решение состоит в том, чтобы просто использовать подписку без RACObserve.

Пример, использующий просто subscribeNext:

self.subjectTwo = [RACSubject subject];

[self.subjectTwo subscribeNext:^(NSString * x) {
    NSLog(@"subjectTwo: %@", x);
}];

[self.subjectTwo sendNext:@"baz"];
[self.subjectTwo sendNext:@"cat"];

что приводит к выводу:

subjectTwo: baz
subjectTwo: cat
Другие вопросы по тегам