文章系列
《ReactiveCocoa 概述》
《RACSignal》
《RACDisposable》
《RACSubject矾麻、RACReplaySubject(內(nèi)附冷信號(hào)和熱信號(hào)的區(qū)別)》
《集合RACTuple启泣、RACSequence》
《RAC 中的通知、代理、KVO, 基本事件绊寻、方法的監(jiān)聽(tīng)》
《rac_liftSelector》
《RACMulticastConnection》
《RACCommand》
《RAC - 核心方法bind》
《RAC - 定時(shí)器》
《RACScheduler》
《RAC - 點(diǎn)擊獲取驗(yàn)證碼 demo》
《RAC - 映射(Map & flattenMap)》
《RAC信號(hào)操作解釋合集》
《RAC - 信號(hào)的生命周期》
-
bind: 給RAC的信號(hào)進(jìn)行綁定,只要信號(hào)已發(fā)送數(shù)據(jù),就能監(jiān)聽(tīng)到,從而把數(shù)據(jù)改成自己想要的
方法分析
bind方法參數(shù): 需要傳入一個(gè)返回值是RACSignalBindBlock
的block.
- (RACSignal *)bind:(RACSignalBindBlock (^)(void))block
RACSignalBindBlock
是一個(gè)block的類型浸卦,返回值是信號(hào),參數(shù)(value,stop)案糙,因此參數(shù)的block返回值也是一個(gè)block.
typedef RACSignal * _Nullable (^RACSignalBindBlock)(ValueType _Nullable value, BOOL *stop);
- 參數(shù)一(value): 表示接收到信號(hào)的原始值限嫌,還沒(méi)做處理
- 參數(shù)二(*stop): 用來(lái)控制綁定Block,如果
*stop = yes
,那么就會(huì)結(jié)束綁定- 返回值:信號(hào)时捌,做好處理怒医,在通過(guò)這個(gè)信號(hào)返回出去,一般使用
RACReturnSignal
,需要手動(dòng)導(dǎo)入頭文件#import "RACReturnSignal.h"
- 原理分析
可以先參考 RACSignal 熟悉下信號(hào)的訂閱.
- 源信號(hào)調(diào)用
bind
, 會(huì)重新創(chuàng)建一個(gè)綁定信號(hào).- 當(dāng)綁定信號(hào)被訂閱, 就會(huì)調(diào)用綁定信號(hào)中的
didSubscribe
生成一個(gè)bindingBlock
.- 當(dāng)源信號(hào)有內(nèi)容發(fā)出, 就會(huì)把內(nèi)容傳遞到
bindingBlock
處理, 調(diào)用bindingBlock(value,stop)
.- 調(diào)用
bindingBlock(value,stop)
會(huì)返回一個(gè)內(nèi)容處理完成的信號(hào)RACReturnSignal
.- 訂閱
RACReturnSignal
就會(huì)拿到綁定信號(hào)的訂閱者, 把處理完成的信號(hào)內(nèi)容發(fā)送出來(lái).
- 代碼練習(xí)
假設(shè)在源信號(hào)發(fā)送的數(shù)據(jù)之前拼接"do bind" 字符串
- (void)RAC_bindTest {
// 創(chuàng)建信號(hào)
RACSubject *subject = [RACSubject subject];
// 綁定信號(hào)
RACSignal *bindSignal = [subject bind:^RACSignalBindBlock _Nullable {
// return 的這個(gè)大的block 的作用:表示綁定了一個(gè)源信號(hào) - subject
return ^RACSignal *(id _Nullable value, BOOL *stop) {
// 什么時(shí)候調(diào)用block: 當(dāng)源信號(hào)有新的值發(fā)出, 就會(huì)來(lái)到這個(gè)block
NSLog(@"subject 發(fā)送了新信號(hào): %@", value);
// block作用:做返回值的處理
NSString *newString = [NSString stringWithFormat:@"do bind: %@", value];
// 做好處理匣椰,通過(guò)信號(hào)返回出去.
return [RACReturnSignal return:newString];
};
}];
// 訂閱綁定信號(hào) -> 獲得處理之后的信號(hào)
[bindSignal subscribeNext:^(id _Nullable x) {
NSLog(@"%@", x);
}];
// 源信號(hào)發(fā)送數(shù)據(jù)
[subject sendNext:@"156xxxxxxxx"];
}
打印結(jié)果:bind 操作新數(shù)據(jù)之后的打印結(jié)果
.End