2016-07-21 2 views
1

Если я добавлю сигнал UIControlEventTouchUpInside к doneButton и вызову API, если API не удастся, вызов будет вызываться. Но если я попытаюсь снова нажать кнопку, событие управления кнопками не активируется.ReactiveCocoa после улавливания ошибки, сигнал кнопки снова не включается

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [[[[[self.doneButton rac_signalForControlEvents:UIControlEventTouchUpInside] doNext:^(id x) { 
     [SVProgressHUD show]; 
    }] flattenMap:^RACStream *(id value) { 
     return [[HttpService sharedService] updateImageData:UIImageJPEGRepresentation(self.signatureImageView.image, 0.5)]; 
    }] catch:^RACSignal *(NSError *error) { 
     [SVProgressHUD showErrorWithStatus:error.localizedDescription]; 
     return [RACSignal empty]; 
    }] subscribeNext:^(id x) { 
     [SVProgressHUD dismiss]; 
     [self.navigationController popToRootViewControllerAnimated:YES]; 
    }]; 
} 
+0

Пожалуйста, проверьте мой ответ. –

ответ

2

Я думаю, что эта нить поможет. https://github.com/ReactiveCocoa/ReactiveCocoa/issues/1218

Сигнал автоматически отменяется, если он терпит неудачу/ошибки. Вы можете использовать - retry, однако это просто будет пытаться выполнить вашу операцию до тех пор, пока это не сработает, что, если есть постоянная проблема, будет просто зацикливаться на неопределенный срок.

Обертывание этого условия в flattenMap будет охватывать проблему, не отписывая начальное наблюдение rac_signalForControlEvents.

[[[[self.doneButton rac_signalForControlEvents:UIControlEventTouchUpInside] doNext:^(id x) { 
    [SVProgressHUD show]; 
}] flattenMap:^RACStream *(id value) { 
    return [[[HttpService sharedService] updateImageData:UIImageJPEGRepresentation(self.signatureImageView.image, 0.5)] 
     catch:^RACSignal *(NSError *error) { 
     [SVProgressHUD showErrorWithStatus:error.localizedDescription]; 
     return [RACSignal empty]; 
     }]; 
}] subscribeNext:^(id x) { 
    [SVProgressHUD dismiss]; 
    [self.navigationController popToRootViewControllerAnimated:YES]; 
}]; 

Я на самом деле не разработал тест с этим кодом. Просто угадайте, исходя из того, что у вас может быть в вашем классе HttpService.

0

Для решения этой проблемы вы можете использовать RACCommand.

RACCommand *doneCommand = 
[[RACCommand alloc] initWithSignalBlock:^RACSignal *(NSString *selected) { 

    return [[[self updateImageSignal] 
       doCompleted:^{ 
        [SVProgressHUD dismiss]; 
        [self.navigationController popToRootViewControllerAnimated:YES]; 
       }] doError:^(NSError *error) { 
        [SVProgressHUD showErrorWithStatus:error.localizedDescription]; 
       }]; 
}]; 

self.doneButton.rac_command = doneCommand; 

Теперь создайте RACSignal посылающий успех и ошибки в соответствии с вашим запросом.

-(RACSignal *)updateImageSignal { 
@weakify(self) 
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { 
    @strongify(self) 
    [[HttpService sharedService] updateImageData:UIImageJPEGRepresentation(self.signatureImageView.image, 0.5) 
             complete:^(BOOL success) { 
              if(success) 
               [subscriber sendNext:@(success)]; 
              else 
               [subscriber sendError:nil]; 
              [subscriber sendCompleted]; 
             }]; 
    return nil; 
}]; 
} 

Надеюсь, это поможет вам. И если у вас возникнут какие-либо вопросы, не стесняйтесь спрашивать.

Смежные вопросы