RAC combineLatest和merge分析

一、combineLatest:使用方法為

RACSubject *baseSubjectTwo = [RACSubject subject];
    RACSubject *baseSignal = [RACSubject subject];
    [[RACSignal combineLatest:@[baseSignal,baseSubjectTwo]]subscribeNext:^(id x) {
        NSLog(@"信號(hào)發(fā)送combineLatest");
    }];

此代碼是將combineLatest:后面的數(shù)組中的信合打包成為一個(gè)新的信號(hào)。只有當(dāng)兩個(gè)信號(hào)都成功發(fā)送過信號(hào)的時(shí)候打包后的信號(hào)才能正常執(zhí)行訂閱后的代碼塊。
測(cè)試代碼如下

self.oneSubejct = [RACSubject subject];
    RACSubject *baseSignal = [RACSubject subject];
    [[RACSignal combineLatest:@[baseSignal,self.oneSubejct]]subscribeNext:^(id x) {
        NSLog(@"信號(hào)發(fā)送combineLatest");
    }];
    
    [baseSignal sendNext:@"testBac"];

控制臺(tái)并沒有任何輸出。因?yàn)橹挥衎aseSignal進(jìn)行的信號(hào)的發(fā)送。self.oneSubject并沒有對(duì)信號(hào)發(fā)送。組合信號(hào)信息發(fā)送失敗。

二、merge
此代碼可以將merge:后數(shù)組中的信號(hào)合并為一個(gè)信號(hào)。只有有任意一個(gè)信號(hào)完成信息的發(fā)送。那么合并后的信號(hào)就可以正常的接收到信號(hào)。
測(cè)試代碼如下

self.oneSubejct = [RACSubject subject];
    RACSubject *baseSignal = [RACSubject subject];
    [[RACSignal merge:@[self.oneSubejct,baseSignal]]subscribeNext:^(id x) {
        NSLog(@"信號(hào)merge發(fā)送信號(hào)");
    }];
    [baseSignal sendNext:@"testBac"];

控制臺(tái)輸出

2018-01-26 15:42:07.763738+0800 RacReplaySubjectTest[3025:162396] 信號(hào)merge發(fā)送信號(hào)

結(jié)果分析:
combineLatest:被打包的信號(hào)都要完成信號(hào)的發(fā)送才能正常接收到信號(hào)。
merge:被合并的信號(hào)有任意一個(gè)完成發(fā)送都能正常被訂閱接收信號(hào)。
注意:combineLatest打包的信號(hào)。只要所有的信號(hào)都已經(jīng)被成功調(diào)閱過。就可以接收到發(fā)送的信號(hào)。信號(hào)被訂閱之后,只要任意一個(gè)信號(hào)觸發(fā)都可以。
效果如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.oneSubejct = [RACSubject subject];
    RACSubject *baseSignal = [RACSubject subject];
    [[RACSignal combineLatest:@[baseSignal,self.oneSubejct]]subscribeNext:^(id x) {
        NSLog(@"信號(hào)發(fā)送combineLatest");
    }];
    [baseSignal sendNext:@"testBac"];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self.oneSubejct sendNext:@"abc"];
}

此程序在第一次運(yùn)行的時(shí)候。因?yàn)橹挥衎aseSignal信號(hào)完成了信號(hào)的發(fā)送。所以combineLatest組合合成的信號(hào)并不能完成信號(hào)的訂閱。
然后我們?cè)趘iew的touch事件上完成了self.oneSubject信號(hào)的發(fā)送。這個(gè)時(shí)候??梢钥吹娇刂婆_(tái)完成了輸出。
2018-01-26 15:49:46.566807+0800 RacReplaySubjectTest[3057:165306] 信號(hào)發(fā)送combineLatest

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容