RAC中常见的高级用法-组合

组合:

concat组合:

按一定顺序执行皇上与皇太子关系

concat底层实现:

1.当拼接信号被订阅,就会调用拼接信号的didSubscribe

2.didSubscribe中会先订阅第一个源信号(signalA)

3.会执行第一个源信号(signalA)的didSubscribe

4.第一个源信号(signalA)didSubscribe中发送值,就会调用第一个源信号(signalA)订阅者的nextBlock,通过拼接信号的订阅者把值发送出来.

5.第一个源信号(signalA)didSubscribe中发送完成,就会调用第一个源信号(signalA)订阅者的completedBlock,订阅第二个源信号(signalB)这时候才激活(signalB)。

6.订阅第二个源信号(signalB),执行第二个源信号(signalB)的didSubscribe

7.第二个源信号(signalA)didSubscribe中发送值,就会通过拼接信号的订阅者把值发送出来.

//创建信号A

RACSignal*signalA =[RACSignal createSignal:^RACDisposable*(id subscriber) {

//发送请求

NSLog(@"上半部分的请求");

//发送信号

[subscriber sendNext:@"上半部分数据"];

//发送完毕

//加上后就可以上部分发送完毕后发送下半部分信号,这个必须要把信号A这个关闭,要不信号B就无法触发

[subscriber sendCompleted];

return nil;

}];

//创建信号B

RACSignal*signalB =[RACSignal createSignal:^RACDisposable*(id subscriber) {

//发送请求

NSLog(@"下半部分的请求");

//发送信号

[subscriber sendNext:@"下半部分数据"];

return nil;

}];

//创建组合信号

// contact:按顺序去连接(组合)

//注意:第一个信号必须调用sendCompleted

RACSignal*contactSignal = [signalA concat: signalB];

//订阅组合信号

[contactSignal subscribeNext:^(id x) {

//按顺序触发,当A信号触发完后,才可使走信号B中的方法,输出结果可以出结果

NSLog(@"%@",x);

}];

输出结果:

2016-08-15 10:02:23.060 RAC——oneday[2742:23026]上半部分的请求

2016-08-15 10:02:27.951 RAC——oneday[2742:23026]上半部分数据

2016-08-15 10:02:29.806 RAC——oneday[2742:23026]下半部分的请求

2016-08-15 10:02:32.961 RAC——oneday[2742:23026]下半部分数据

then:

用于连接两个信号,当第一个信号完成,才会连接then返回的信号

注意: 使用then之前的信号的值会被忽略掉.

底层实现:

1、先过滤掉之前的信号发出的值。

2.使用concat连接then返回的信号

//创建信号A

RACSignal*signalA = [RACSignalvcreateSignal:^RACDisposable*(id subscriber) {

//发送请求

NSLog(@"发送上部分的请求");

//发送信号

[subscriber sendNext:@"上部分的数据"];

//发送完毕

//加上后就可以发送上部分的完毕后发送下部分的信号

[subscriber sendCompleted];

return nil; 

}];

//创建信号B

RACSignal*signalB = [RACSignal createSignal:^RACDisposable*(id subscriber) {

//发送请求

NSLog(@"发送下部分的请求");

//发送信号

[subscriber sendNext:@"下部分的数据"];

return nil;

}];

//创建组合信号

//then会忽略点第一个信号的所有值

RACSignal*signalThen = [signalA then:^RACSignal*{

//返回的信号就是需要组合的信号,这里回将signalA信号忽略点

return signalB;

}];

//订阅信号

[signalThen subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

2016-08-15 10:06:27.643 RAC——oneday[4045:39265]发送上部分的请求

2016-08-15 10:06:27.645 RAC——oneday[4045:39265]发送下部分的请求

2016-08-15 10:06:31.261 RAC——oneday[4045:39265]下部分的数据

merge

把多个信号合并为一个信号,任何一个信号有新值的时候就会调用,没有顺序

//创建信号A

RACSubject*siganlA = [RACSubject subject];

//创建信号B

RACSubject*signalB = [RACSubject subject];

//组合信号

RACSubject*signalMerage = [siganlA merge:signalB];

//订阅信号

[signalMerage subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

//发送数据,这里的发送消息不一定需要哪个信号发送完毕后才可以,没有限制

[signalB sendNext:@"下半部数据"];

[siganlA sendNext:@"上半部数据"];

2016-08-15 10:20:40.660 RAC——oneday[4894:49228]下半部数据

2016-08-15 10:20:40.660 RAC——oneday[4894:49228]上半部数据

zipWith:

等所有信号都发送内容的时候才会调用(夫妻关系)

把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元组,才会触发压缩流的next事件

底层实现:

1.定义压缩信号,内部就会自动订阅signalA,signalB

2.每当signalA或者signalB发出信号,就会判断signalA,signalB有没有发出个信号,有就会把最近发出的信号都包装成元组发出。

//创建信号A

RACSubject*signalA = [RACSubject subject];

//创建信号B

RACSubject*signalB = [RACSubject subject];

//压缩成一个信号

//当一个界面多个请求时,需要等所有的请求都完成才能更新UI

//打印顺序跟组合顺序,跟发送的顺序无关

//把两个信号合成一个信号

RACSignal*signalZipwith = [signalA zipWith:signalB];

//订阅信号

[signalZipwith subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

//发送信号

[signalA sendNext:@"LUO"];

[signalB sendNext:@"CRAZY"];

2016-08-15 10:32:19.272 RAC——oneday[5618:57722] (

LUO,

CRAZY

)

combineLatest:

将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号。

底层实现:

1.当组合信号被订阅,内部会自动订阅signalA,signalB,必须两个信号都发出内容,才会被触发。

2.并且把两个信号组合成元组发出。

//创建信号A

RACSubject*signalA = [RACSubject subject];

//创建信号B

RACSubject*signalB = [RACSubject subject];

//把两个信号合成一个信号

RACSignal*signalCombineLatest = [signalA combineLatestWith:signalB];

//订阅组合信号

[signalCombineLatest subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

[signalA sendNext:@"A"];

[signalB sendNext:@"B"]; 

2016-08-15 10:43:47.345 RAC——oneday[6427:66814] (

A,

B

)

reduce聚合:用于信号发出的内容是元组,把信号发出元组的值聚合成一个值

常见的用法(先组合在聚合)。combineLatest:(id)signals reduce:(id (^)())reduceBlock

reduce中的block简介:

reduceblcok中的参数,有多少信号组合,reduceblcok就有多少参数,每个参数就是之前信号发出的内容

reduceblcok的返回值:聚合信号之后的内容。

底层实现:

订阅聚合信号,每次有内容发出,就会执行reduceblcok,把信号内容转换成reduceblcok返回的值。

- (void)combineLatestWithReduce

{

/*登录界面:两个文本框(账户,密码) + 一个登录按钮*/

//组合多个信号

//reduce:聚合

//reduceBlock的参数与组合的信号一一对应,可以在reduce:后拿到信号的值

RACSignal *combineSignal = [RACSignal combineLatest:@[_accountName.rac_textSignal, _passWord.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){

//block:只要源信号发送内容就会调用,组合成新的一个值

//聚合的值就是组合信号的内容

return @(account.length && pwd.length);

}];

//订阅信号

//    [combineSignal subscribeNext:^(id x) {

//        self.loginBtn.enabled = [x boolValue];

//

//    }];

//等同于

RAC(self.loginBtn, enabled) = combineSignal;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容