Я использую парадигму MVVM
в моем iOS с RACSignal
. Пока все получилось отлично. Однако я испытываю проблему при подписке на сигналы. На первой подписке все работает нормально. Однако дальнейших подписок нет.Подписаться на выпуск с RACSignal
Код
В моей viewModel
У меня есть RACSignal
заявил так:
viewModel.h
@property (strong, readonly, nonatomic) RACSignal *updatedContentSignal;
viewModel.m
@property (nonatomic, readwrite, strong) RACSubject *updatedContentSignal;
Именно тогда initiali СЭД как и в ViewModel-х designated initialiser
:
self.updatedContentSignal = [[RACSubject alloc]init];
Тогда, когда я на самом деле использовать сигнал в viewModel
я делаю такого рода вещи: В случае необходимости в различных местах в ViewModel - обычно в пределах блочного метода веб-службы
[(RACSubject *)self.updatedContentSignal sendNext:nil];
[(RACSubject *)self.updatedContentSignal sendCompleted];
[(RACSubject *)self.updatedContentSignal sendError:error];
в viewController
подписаться на сигнал следующим образом:
[self.viewModel.updatedContentSignal subscribeNext:^(id x) {
} error:^(NSError *error) {
} completed:^{
}];
Я подписываюсь один раз сигнала на viewDidLoad
Таким образом, все работы по первому viewDidLoad
вызова
Проблемы
Когда я уйду от viewController
и вернуться к нему viewWillAppear
называюсь, и viewModel
выстреливает различные методы, которые вызывают сигнал:
[(RACSubject *)self.updatedContentSignal sendNext:nil];
[(RACSubject *)self.updatedContentSignal sendCompleted];
[(RACSubject *)self.updatedContentSignal sendError:error];
Однако й e viewController
больше не получает сигнал. Кажется, он работает только с первой подпиской.
Есть ли способ, чтобы сигнал продолжал работать каждый раз, когда один из сигналов updateContent
вызывается/увольняется?
Как ваш код не является очень всеобъемлющим, я могу только сказать, сигнал будет уволен, как только она будет завершена (либо через sendCompleted или sendError :). Поэтому, если вы хотите продолжить, вам нужно будет использовать sendNext :. Используйте sendCompleted только в том случае, если вы хотите показать, что это больше не используется. SendError используется, если вы получили сообщение об ошибке .. поэтому в вашем блоке веб-службы вам понадобится что-то вроде if (! Error) sendNext: else sendError: error; – Jan
Спасибо за информативный пост. Вы правы, что его отправка завершена, что эффективно убивает сигнал до следующего раза, когда я его воссоздаю, когда я показываю с ним новый viewController. Если вы могли бы поместить свой комментарий в качестве ответа, я соглашусь с ним. Благодаря @Dimitri – Tander