gpt4 book ai didi

reactive-cocoa - ReactiveCocoa - 如果第一个信号完成且没有任何值,则订阅第二个信号

转载 作者:行者123 更新时间:2023-12-01 14:19:37 24 4
gpt4 key购买 nike

假设我有两个信号:一个便宜的信号和一个昂贵的信号:

RACSignal *localSignal;      // Cheap signal. Sends object without network request 
// if possible, otherwise completes immediately.

RACSingal *networkSignal; // Expensive one. Always sends data,
// but requires expensive network operation.

现在我想创建一个信号,它从第一个信号发送值(如果有),或者订阅第二个信号并从该信号发送数据。

以下解决方案几乎给了我我想要的,但它总是订阅第二个昂贵的信号,即使采用第一个信号的值,并且忽略第二个信号的值。

[[localDataSignal concat:networkDataSignal] take:1];

有没有办法有效解决问题?

最佳答案

我刚刚发现问题所在。本地信号使用创建和调用它的同一线程:

RACSignal *localSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"Perfoming local operation");
[subscriber sendNext:@"local value"];
[subscriber sendCompleted];
return nil;
}];

正如我所看到的问题(我不确定 100%),take:1 甚至没有机会处理串联的网络信号。但是,如果我在与主线程调度程序不同的地方调度本地信号,那么 take:1 将按预期工作——在获得第一个值后,它会破坏链条。

简单来说,此代码片段有效:

[[[localSignal deliverOn:[RACScheduler scheduler]] concat:networkSignal] take:1]

它给了我我想要的东西:本地信号的值(如果有),或者订阅网络信号并给我它的值。如果本地信号发送值,则网络信号永远不会被订阅。

经验法则是检查信号工作的线程,然后 take:1 应该按预期工作。

更新:-deliveOnMainThread还为-take:提供了处理队列的机会。

关于reactive-cocoa - ReactiveCocoa - 如果第一个信号完成且没有任何值,则订阅第二个信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28449433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com