NSNotificationCenter aracılığıyla gelen başarılı bir bildirim ve hata bildirimi var. Bu iki bildirimden gelen sinyallerin, başarısızlık bildirimi başladığı sırada bir hata veren bir sinyale ve bir sonraki başarı bildirimi bittiğinde tamamıyla tamamlanmasının nasıl bir araya getirileceğine karar vermek için bazı testler yazdım.Sinyalleri birleştirmek ve tamamlandığında veya hata yaptığında tamamlamak için sinyal sinyali oluşturmanın tercih edilen yolu nedir?
Halihazırda tüm bloklar vurulmayacak, bir sonraki ve hata yakalanmayacaktır. Ayrıca, ikincil ikramiye sorusu: neden @ [errorNotification, completeNotification] .rac_sequence.signal, aşağıdaki sinyal oluşturma sinyaliyle aynı şeyi yapıyor?
Kodu: Böyle
-(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);
}
İlk testinizde bildirim adını sadece “TEST” olarak gönderdiğinizde “TEST_FAILURE” demek istediniz, değil mi? – yonosoytu
Evet. Bu benim testimde bir hataydı. oh d'. – Jon