Возможно, я все еще борюсь с реактивной кривой обучения, но мне трудно понять, как соединить нереактивный класс с остальной частью моего реактивного кода. Я использую категорию для расширения нереактивного класса.
Свойство представляет собой просто перечисление, представляющее текущее состояние сетевого действия, такие состояния, как «Новое», «Отправлено», «Обрабатывается» и «Завершено». Прямо сейчас я написал следующий метод в своей категории:
@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
return RACAble(self, state);
}
@end
Однако при переходе состояния из «Обработка» -> «Завершено» или из любого состояния в «Ошибка» я хочу, чтобы этот сигнал отправлял «Завершено» или «Ошибка» вместо «Следующее значение». Как я могу сделать это в категории? Я хочу сделать что-то вроде:
@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
return [RACAble(self, state) map:^(NSNumber *state){
if ([state intValue] == iRequestStateComplete)
{
# SEND COMPLETE
}
else if ([state intValue] == iRequestStateErrored)
{
# SEND ERROR
}
else
{
return state;
}
}];
}
@end
редактировать: я взглянул на GHAPIDemo и придумал следующее:
- (RACSignal*) rac_RequestSignal
{
RACSubject *subject = [[RACReplaySubject alloc] init];
[[RACAble(self, state) subscribeNext:^(NSNumber* s){
if ( [s intValue] == JRequestStateCompleted)
{
[subject sendNext:self];
[subject sendCompleted];
}
else if ([s intValue] == JRequestStateErrored)
{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// .. Set up dict with necessary values.
NSError *error = [NSError errorWithDomain:@"blah" code:1 userInfo:dict];
[subject sendError:error];
}
}];
return subject;
}
Я не уверен на 100%, что это правильный путь, но, похоже, он работает.