2016-07-21 3 views
1

doneButtonUIControlEventTouchUpInside信号を追加して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を使用することができますが、isが失敗しない限り動作を試し続けるだけです。永続的な問題が無期限に繰り返される場合は、そのままにしてください。

この条件をflattenMapにラップすると、最初のrac_signalForControlEventsの観察を取り消さずに問題がキャプチャされます。

を参照してください。mdiep GitHub上のスレッドのコメントです。

[[[[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 *)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; 
}]; 
} 

ご希望の場合はお手数ですが、ご質問がありましたら、お気軽にお問い合わせください。

関連する問題