Tôi có thông báo thành công và thông báo lỗi thông qua NSNotificationCenter. Tôi đã viết một số xét nghiệm để tìm ra cách kết hợp các tín hiệu từ hai thông báo đó thành một tín hiệu cung cấp lỗi khi các thông báo thất bại và tiếp theo là hoàn thành khi thông báo thành công.Cách ưa thích để tạo tín hiệu tín hiệu kết hợp với tín hiệu và hoàn thành khi hoàn thành hoặc lỗi là gì?
Hiện tại, các khối hoàn chỉnh sẽ không bị trúng, tiếp theo và lỗi sẽ bị ảnh hưởng.
Ngoài ra, câu hỏi thưởng thứ cấp: tại sao không @ [errorNotification, completeNotification] .rac_sequence.signal làm điều tương tự như tín hiệu tạo tín hiệu bên dưới?
Code:
-(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);
}
Tôi cho rằng khi trong lần kiểm tra đầu tiên bạn gửi tên thông báo là “TEST” nghĩa là “TEST_FAILURE”, phải không? – yonosoytu
Có. Đó là một lỗi trong bài kiểm tra của tôi. d'oh. – Jon