我有通过 NSNotificationCenter 的成功通知和失败通知。我编写了一些测试来弄清楚如何将来自这两个通知的信号组合成一个信号,该信号在失败通知命中时提供错误,在成功通知命中时提供下一个信号。
目前完整的块不会被击中,下一个和错误会被击中。
另外,第二个额外的问题:为什么 @[errorNotification, completeNotification].rac_sequence.signal 不做与下面的信号创建信号相同的事情?
代码:
-(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);
}