2016-07-21 46 views
1

Wenn ich ein UIControlEventTouchUpInside Signal zu einem doneButton hinzufügen, und rufen Sie eine API auf, wenn das API fehlschlägt, wird der Fang aufgerufen. Wenn ich jedoch versuche, erneut auf den Button zu klicken, wird das Button-Control-Event nicht ausgelöst.ReactiveCocoa nach dem Fehler, das Button-Signal nicht erneut ausgelöst

- (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

Bitte überprüfen Sie meine Antwort. –

Antwort

2

Ich denke, dieser Thread wird helfen. https://github.com/ReactiveCocoa/ReactiveCocoa/issues/1218

Ein Signal wird automatisch abgemeldet, wenn es fehlschlägt/Fehler. Sie können - retry verwenden, aber das wird einfach versuchen, Ihre Operation, bis nicht scheitert, was, wenn es ein fortwährendes Problem ist, wird einfach endlos Schleife.

Wenn Sie diese Bedingung in eine flattenMap einpacken, wird das Problem erfasst, ohne die anfängliche rac_signalForControlEvents Beobachtung abzubestellen.

Siehe mdiep s Kommentar im Thread oben auf GitHub, und vielleicht etwas wie tun.

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

Ich habe nicht wirklich einen Test mit diesem Code erstellt. Erraten Sie nur, was Sie in Ihrer Klasse HttpService haben könnten.

0

Sie können RACCommand verwenden, um dieses Problem zu lösen.

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; 

erstellen Jetzt RACSignal, die entsprechend Ihrem Antrag Erfolg und Fehler senden.

-(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; 
}]; 
} 

Ich hoffe, es wird Ihnen helfen. Und wenn Sie irgendwelche Fragen haben, dann zögern Sie nicht zu fragen.