访问ReactiveCocoa -flattenMap中的先前值:/ - then:chain

时间:2015-06-04 14:43:12

标签: ios objective-c reactive-cocoa

假设我使用-flattenMap:-then:拥有一系列ReactiveCocoa信号,如下所示:

__weak typeof(self) weakSelf = self

[[[self fooSignal] flattenMap:^RACStream *(Foo *foo) {
    return [weakSelf barSignal];
}] then:^RACSignal *{
    // create a signal using foo
}];

就我而言,barSignal依赖于fooSignal完成(严格来说,next - 但fooSignal只执行一次)而没有错误,并且next的{​​{1}}值是荒谬的(barSignal并不真正适用)。即使它发送了+combineLatest:,它们依赖于操作,而非并行操作。

显然,我可以使用next变量来访问__block,但这在风格上不正确且难以遵循(不是严格的链向下)。

我可以编写一个自定义运算符来实现这一点,但是我认为代码要比foo变量多得多,并且很难做出通用运算符。

是否有一种干净的方式来访问__block

3 个答案:

答案 0 :(得分:2)

执行此操作的最佳方式似乎是使用foreach<?php /* * Generated configuration file * Generated by: phpMyAdmin 4.4.8 setup script * Date: Thu, 04 Jun 2015 15:01:24 +0000 */ /* Servers configuration */ $i = 1; /* Server: localhost [1] */ $i++; $cfg['Servers'][$i]['verbose'] = ''; $cfg['Servers'][$i]['host'] = 'localhost'; $cfg['Servers'][$i]['port'] = ''; $cfg['Servers'][$i]['socket'] = ''; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['user'] = 'root'; $cfg['Servers'][$i]['password'] = ''; /* End of servers configuration */ $cfg['DefaultLang'] = 'it'; $cfg['blowfish_secret'] = '–––––––––––.––––––'; $cfg['UploadDir'] = ''; $cfg['SaveDir'] = ''; $cfg['ServerDefault'] = 1; ?>

-concat:

答案 1 :(得分:1)

您还可以使用-mapReplace:

_weak typeof(self) weakSelf = self

[[[self fooSignal] flattenMap:^RACStream *(Foo *foo) {
    return [[weakSelf barSignal] mapReplace:foo];
}] flattenMap:^RACStream *(Foo *foo) {
    // create a signal using foo
}];

答案 2 :(得分:0)

我会删除第二个-flattenMap:,而是在-then:的末尾添加barSignalfoo变量将在那里,并且在订阅之前它将等到barSignal完成。

__weak typeof(self) weakSelf = self

[[self fooSignal] flattenMap:^RACStream *(Foo *foo) {
    return [[weakSelf barSignal] then:^RACSignal * {
        // create a signal using foo
        return [RACSignal createSignal ...
    }];
}];