2015-12-03 2 views
0

Я использую парадигму 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 вызывается/увольняется?

+1

Как ваш код не является очень всеобъемлющим, я могу только сказать, сигнал будет уволен, как только она будет завершена (либо через sendCompleted или sendError :). Поэтому, если вы хотите продолжить, вам нужно будет использовать sendNext :. Используйте sendCompleted только в том случае, если вы хотите показать, что это больше не используется. SendError используется, если вы получили сообщение об ошибке .. поэтому в вашем блоке веб-службы вам понадобится что-то вроде if (! Error) sendNext: else sendError: error; – Jan

+0

Спасибо за информативный пост. Вы правы, что его отправка завершена, что эффективно убивает сигнал до следующего раза, когда я его воссоздаю, когда я показываю с ним новый viewController. Если вы могли бы поместить свой комментарий в качестве ответа, я соглашусь с ним. Благодаря @Dimitri – Tander

ответ

1

Поскольку ваш код не является исчерпывающим, я могу только сказать, что сигнал будет отклонен, как только он будет завершен (либо через sendCompleted:, либо sendError:).

Итак, если вы хотите продолжить, вам нужно будет использовать только sendNext:.
Используйте только sendCompleted, если вы хотите показать, что это больше не используется.

SendError: используется, в случае, если вы получите сообщение об ошибке.так что в вашем блоке веб-сервиса вам нужно что-то вроде:

if(!error) { 
    sendNext:xxx; 
} else { 
    sendError:error; 
} 
Смежные вопросы