iOS RAC - 核心方法(bind)

文章系列
《RACSignal 》
《RACDisposable》
《RACSubject、RACReplaySubject》
《iOS RAC - 基本用法》
《iOS RAC - 定時器》
《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中我們會看到bind,了解一下如何使用吧

1、創(chuàng)建信號

RACSubject * subject = [RACSubject subject];

2、綁定信號

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

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

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

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

[subject sendNext:@"啟動自毀程序"];

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

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

    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);
    }];

在愉快的運行……不對,不愉快啊,程序掛掉了。
為什么呢?
因為我們用原始信號(subject)發(fā)送了數(shù)據(jù),但是返回的這個信號里面并沒有這個數(shù)據(jù)return [[RACSignal alloc] init],所以就掛掉啦。

既然這樣子,我們把數(shù)據(jù)返回就OK啦
這個操作比較騷因為默認是沒有導入頭文件的,所以我們先要導入頭文件#import "RACReturnSignal.h"

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

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


底層實現(xiàn)

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



2、bind這個方法有點長,慢慢看

1

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

然后下面接著就是返回一個信號并且把block保存了起來

2

所以我們在訂閱信號之后調用的block就是這個block

3

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



接下來

4

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

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


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

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容