文章系列
《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》
在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)長,慢慢看

從上面的圖中可以看出,block不能為NULL
然后下面接著就是返回一個(gè)信號(hào)并且把block保存了起來

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

在保存block之后又定義了兩個(gè)block分別是:completeSignal和addSignal
接下來

紅色部分訂閱,綠色部分的時(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方法
