iOS RAC - 核心方法(bind)

文章系列
《RACSignal 》
《RACDisposable》
《RACSubject、RACReplaySubject》
《iOS RAC - 基本用法》
《iOS RAC - 定時(shí)器》
《iOS RAC - RACMulticastConnection》
《iOS RAC - RACCommand》
《iOS RAC - 核心方法bind》
《iOS RAC - 集合RACTuple、RACSequence》
《iOS RAC - rac_leftSelector》
《iOS RAC - 映射》
《iOS RAC - 過濾》
《iOS RAC - 登錄頁面,MVVM》



git地址

在RAC中我們會(huì)看到bind,了解一下如何使用吧

1、創(chuàng)建信號(hào)

RACSubject * subject = [RACSubject subject];

2、綁定信號(hào)

 [subject bind:^RACSignalBindBlock _Nonnull{
     
 }];
  • 不知道返回值是啥,點(diǎn)進(jìn)去看看
typedef RACSignal * _Nullable (^RACSignalBindBlock)(ValueType _Nullable value, BOOL *stop);

看完之后知道了,他的返回是要是一個(gè)信號(hào),并且?guī)蓚€(gè)參數(shù):一個(gè)value,一個(gè)bool

[subject bind:^RACSignalBindBlock _Nonnull{
        
        return ^RACSignal *(id _Nullable value, BOOL *stop){
            
            return [[RACSignal alloc] init];
        };
    }];

現(xiàn)在我們已經(jīng)綁定啦,然后我們愉快的運(yùn)行吧,成功運(yùn)行完成,一切都是那么風(fēng)平浪靜,接下來要發(fā)送信息了。

[subject sendNext:@"啟動(dòng)自毀程序"];

現(xiàn)在問題來了,我們都發(fā)送數(shù)據(jù)了,在哪里接收?。????

bind方法中返回的就是signal,既然是信號(hào),那么就訂閱。

    RACSignal * signal = [subject bind:^RACSignalBindBlock _Nonnull{
        
        return ^RACSignal *(id _Nullable value, BOOL *stop){
            
            return [[RACSignal alloc] init];
        };
    }];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"收到的數(shù)據(jù) - %@",x);
    }];

在愉快的運(yùn)行……不對,不愉快啊,程序掛掉了。
為什么呢?
因?yàn)槲覀冇迷夹盘?hào)(subject)發(fā)送了數(shù)據(jù),但是返回的這個(gè)信號(hào)里面并沒有這個(gè)數(shù)據(jù)return [[RACSignal alloc] init],所以就掛掉啦。

既然這樣子,我們把數(shù)據(jù)返回就OK啦
這個(gè)操作比較騷因?yàn)槟J(rèn)是沒有導(dǎo)入頭文件的,所以我們先要導(dǎo)入頭文件#import "RACReturnSignal.h"

然后把return [[RACSignal alloc] init]替換為return [RACReturnSignal return:value]
這樣子就可以啦,至于為什么返回value,這個(gè)就簡單啦,通過我們發(fā)送的數(shù)據(jù)是字符串,一個(gè)對象,總不可能用一個(gè)bool去表示吧,
所以value就是我們發(fā)送的數(shù)據(jù),如果不需要進(jìn)行處理,直接返回value就ok了。

現(xiàn)在我們已經(jīng)在應(yīng)用層使用了bind,但是感覺并沒有什么卵用,其實(shí)有一種應(yīng)用場景,就是字典轉(zhuǎn)模型,現(xiàn)在先去看看底層是如何實(shí)現(xiàn)的吧


底層實(shí)現(xiàn)

1、RACSubject * subject = [RACSubject subject];這個(gè)可以參照iOS RAC - RACSubject、RACReplaySubject這個(gè)文章,這里不做介紹了



2、bind這個(gè)方法有點(diǎn)長,慢慢看

1

從上面的圖中可以看出,block不能為NULL

然后下面接著就是返回一個(gè)信號(hào)并且把block保存了起來

2

所以我們在訂閱信號(hào)之后調(diào)用的block就是這個(gè)block

3

在保存block之后又定義了兩個(gè)block分別是:completeSignaladdSignal



接下來

4

紅色部分訂閱,綠色部分的時(shí)候就把發(fā)送的數(shù)據(jù)x在bindingblock中調(diào)用,所以這里的x就是對應(yīng)外面的value。

所以在外面執(zhí)行sendnext 方法之后就會(huì)調(diào)用bindingBlock,就會(huì)返回信號(hào),在去調(diào)用subscribeNext


簡單點(diǎn)說就是在我們發(fā)送數(shù)據(jù)的時(shí)候,才會(huì)回來執(zhí)行我們bind里面的信號(hào)的block,執(zhí)行了bind方法里面的信號(hào)的block,才會(huì)去調(diào)用信號(hào)的subscribeNext方法

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

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

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