Objective c 在完成或出现错误时,创建信号组合到信号并完成的信号的首选方法是什么?

Objective c 在完成或出现错误时,创建信号组合到信号并完成的信号的首选方法是什么?,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我有通过NSNotificationCenter发送的成功通知和失败通知。我编写了一些测试,以了解如何将这两个通知中的信号组合成一个信号,在失败通知命中时提供一个错误,在成功通知命中时提供一个完整的错误 当前,完整的块不会被命中,下一个和错误会被命中 还有,第二个额外问题:@[errorNotification,completeNotification].rac_sequence.signal为什么不做与下面信号创建信号相同的事情 代码: -(无效)测试\u信号的\u平坦\u信号\u和\u将\u

我有通过NSNotificationCenter发送的成功通知和失败通知。我编写了一些测试,以了解如何将这两个通知中的信号组合成一个信号,在失败通知命中时提供一个错误,在成功通知命中时提供一个完整的错误

当前,完整的块不会被命中,下一个和错误会被命中

还有,第二个额外问题:@[errorNotification,completeNotification].rac_sequence.signal为什么不做与下面信号创建信号相同的事情

代码:

-(无效)测试\u信号的\u平坦\u信号\u和\u将\u通知\u转换为\u错误{
RACSignal*errorNotification=[[NSNotificationCenter defaultCenter]rac_addObserverForName:@“测试失败”对象:nil]take:1];
errorNotification=[errorNotification:Map:^(NSNotification*通知){
返回[RACSignal error:[NSError errorWithDomain:@“RAC_测试”代码:1用户信息:nil]];
}];
RACSubject*completeNotification=[RACSubject];
RACSignal*signalOfSignals=[[RACSignal]
createSignal:^RAC*(id订户){
[订户发送下一步:错误通知];
[订户发送下一步:完成化];
[用户发送完成];
返回零;
}]
压扁];
__block BOOL hitCompleted=否;
[信号的信号]
subscribeNext:^(id val){
STFail(无);
}
错误:^(n错误*错误){
已完成=是;
}
已完成:^{
STFail(无);
}];
[[NSNotificationCenter defaultCenter]postNotificationName:@“测试”对象:self];
StatsertTrue(已完成,无);
}
-(无效)测试\u展平\u信号\u和\u点击\u下一个\u完成\u上的\u通知{
RACSubject*errorNotification=[RACSubject];
RACSignal*completeNotification=[[NSNotificationCenter defaultCenter]rac_addObserverForName:@“测试成功”对象:nil]take:1];
RACSignal*signalOfSignals=[[RACSignal]
createSignal:^RAC*(id订户){
[订户发送下一步:错误通知];
[订户发送下一步:完成化];
[用户发送完成];
返回零;
}]
压扁];
__block BOOL hitCompleted=否;
__block BOOL hitNext=否;
[信号的信号]
subscribeNext:^(id val){
hitNext=是;
}
错误:^(n错误*错误){
STFail(无);
}
已完成:^{
已完成=是;
}];
[[NSNotificationCenter defaultCenter]postNotificationName:@“测试成功”对象:self];
StatsertTrue(已完成,无);
StatsertTrue(hitNext,无);
}

在成功和失败的情况下,这样的事情对我都适用:

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  RACDisposable *success = [[[[NSNotificationCenter defaultCenter]
                            rac_addObserverForName:@"TEST_SUCESS" object:nil]
                            take:1]
                            subscribeNext:^(id x) {
                              [subscriber sendNext:x];
                            } completed:^{
                              [subscriber sendCompleted];
                            }];
  RACDisposable *failure = [[[[NSNotificationCenter defaultCenter]
                            rac_addObserverForName:@"TEST_FAILURE" object:nil]
                            take:1]
                            subscribeNext:^(id x) {
                            [subscriber sendError:
                              [NSError errorWithDomain:@"RAC_TEST" code:1 userInfo:nil]];
                            }];
  return [RACDisposable disposableWithBlock:^{
    [success dispose];
    [failure dispose];
  }];
}];
RACSignal*signal=[RACSignal createSignal:^RACDisposable*(id订户){
RAC*成功=[[[NSNotificationCenter defaultCenter]
rac_addObserverForName:@“测试成功”对象:nil]
拍摄:1]
下标文本:^(id x){
[用户发送下一步:x];
}已完成:^{
[用户发送完成];
}];
RAC一次性*故障=[[[NSNotificationCenter defaultCenter]
rac_addObserverForName:@“测试失败”对象:nil]
拍摄:1]
下标文本:^(id x){
[订阅服务器发送错误:
[N错误errorWithDomain:@“RAC_测试”代码:1用户信息:无]];
}];
返回[RAC一次性处置带块:^{
[成功处置];
[失败处置];
}];
}];

我用这两种一次性用品创建了一个独特的信号。成功信号发送“下一步”和“完成”(
take:1
对于完成的工作非常重要)。故障信号发送“错误”。我们的想法是使用发送到块中的
订户
来正确转发其他两个信号中的事件。

您可以使用内置操作符来完成此操作:

RACSignal *successNotification = [[NSNotificationCenter.defaultCenter
    rac_addObserverForName:SuccessNotification object:nil]
    take:1];

RACSignal *errorNotification = [[NSNotificationCenter.defaultCenter
    rac_addObserverForName:FailureNotification object:nil]
    flattenMap:^(NSNotification *notification) {
        // Convert to a meaningful error somehow.
        NSError *error = …;

        return [RACSignal error:error];
    }];

RACSignal *signal = [RACSignal merge:@[ successNotification, errorNotification ]];
这将为您处理通知,并且更明显地指示如何将每个通知映射到一个值或一个错误

为什么@[errorNotification,completeNotification].rac_sequence.signal不执行与下面的信号创建信号相同的操作


创建的信号将异步发送其值,这与您在示例中创建的信号不同。

我想,在第一次测试中,您发送通知名称时,您的意思是“测试失败”,对吗?是的。那是我测试中的一个错误。哦,谢谢你的回复。。。唯一的变化是,我将故障通知信号展平映射到[RACSigna error:],而不是订阅下一个,我只是订阅错误并将其传递。他的回答不需要明确的订户,这总是更好的。
RACSignal *successNotification = [[NSNotificationCenter.defaultCenter
    rac_addObserverForName:SuccessNotification object:nil]
    take:1];

RACSignal *errorNotification = [[NSNotificationCenter.defaultCenter
    rac_addObserverForName:FailureNotification object:nil]
    flattenMap:^(NSNotification *notification) {
        // Convert to a meaningful error somehow.
        NSError *error = …;

        return [RACSignal error:error];
    }];

RACSignal *signal = [RACSignal merge:@[ successNotification, errorNotification ]];