Mam powiadomienie o powodzeniu i powiadomienie o niepowodzeniu otrzymane za pośrednictwem NSNotificationCenter. Napisałem kilka testów, aby dowiedzieć się, jak połączyć sygnały z tych dwóch powiadomień w jeden sygnał, który dostarcza błąd, gdy powiadomienie o awarii trafia, a następnie kończy się po zakończeniu powiadomienia o powodzeniu.Jaki jest preferowany sposób tworzenia sygnału sygnałów, aby połączyć się z sygnałami i zakończyć, gdy wystąpi błąd?
Obecnie kompletne bloki nie zostaną trafione, następnie błąd zostanie trafiony.
Również dodatkowe pytanie dodatkowe: dlaczego @ notacja błędu, pełna notyfikacja] .rac_sequence.signal robią to samo, co sygnał tworzenia sygnału poniżej?
Kod:
-(void)test_flatten_signal_of_signals_and_convert_notification_to_error{
RACSignal *errorNotification = [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"TEST_FAILURE" object:nil] take:1];
errorNotification = [errorNotification flattenMap:^(NSNotification *notification){
return [RACSignal error:[NSError errorWithDomain:@"RAC_TEST" code:1 userInfo:nil]];
}];
RACSubject *completeNotification = [RACSubject subject];
RACSignal *signalOfSignals = [[RACSignal
createSignal:^RACDisposable *(id<RACSubscriber> subscriber){
[subscriber sendNext:errorNotification];
[subscriber sendNext:completeNotification];
[subscriber sendCompleted];
return nil;
}]
flatten];
__block BOOL hitCompleted = NO;
[signalOfSignals
subscribeNext:^(id val){
STFail(nil);
}
error:^(NSError *err){
hitCompleted = YES;
}
completed:^{
STFail(nil);
}];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TEST" object:self];
STAssertTrue(hitCompleted, nil);
}
-(void)test_flatten_signal_of_signals_and_hits_next_complete_on_notification{
RACSubject *errorNotification = [RACSubject subject];
RACSignal *completeNotification = [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"TEST_SUCESS" object:nil] take:1];
RACSignal *signalOfSignals = [[RACSignal
createSignal:^RACDisposable *(id<RACSubscriber> subscriber){
[subscriber sendNext:errorNotification];
[subscriber sendNext:completeNotification];
[subscriber sendCompleted];
return nil;
}]
flatten];
__block BOOL hitCompleted = NO;
__block BOOL hitNext = NO;
[signalOfSignals
subscribeNext:^(id val){
hitNext = YES;
}
error:^(NSError *err){
STFail(nil);
}
completed:^{
hitCompleted = YES;
}];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TEST_SUCCESS" object:self];
STAssertTrue(hitCompleted, nil);
STAssertTrue(hitNext, nil);
}
Przypuszczam, że podczas pierwszego testu wysyłacie nazwę powiadomienia jako "TEST", co oznacza "TEST_FAILURE", prawda? – yonosoytu
Tak. To był błąd w moim teście. d'oh. – Jon