好用的ReactiveCocoa.docx
《好用的ReactiveCocoa.docx》由会员分享,可在线阅读,更多相关《好用的ReactiveCocoa.docx(15页珍藏版)》请在冰豆网上搜索。
好用的ReactiveCocoa
这样好用的ReactiveCocoa,根本停不下来
前戏
我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物。
ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象,初看你不知道它是要干嘛的,等你用上了之后,就发现,有了它你是想干嘛就干嘛,编码从未如此流畅。
在此我不会讲ReactiveCocoa的原理,因为不能讲明白的才叫抽象。
我也不会提及相关概念。
我只是让你看看我用着它是有多爽。
代码的四十八手
察值
你别动,你一动我就知道。
1.@weakify(self);
2.[RACObserve(self, value) subscribeNext:
^(NSString* x) {
3. @strongify(self);
4. NSLog(@"你动了");
5.}];
单边
你唱歌,我就跳舞。
textField的内容长度隐射成BOOL值,绑定到confirmButton的enable属性上面,当textField输入内容不为空的时候,confirmButton的enable=YES。
1.RACSignal *signalA = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@"唱歌"];
3. [subscriber sendCompleted];
4. return nil;
5. }];
6. RAC(self, value) = [signalA map:
^id(NSString* value) {
7. if ([value isEqualToString:
@"唱歌"]) {
8. return @"跳舞";
9. }
10. return @"";
11. }];
双边
你向西,他就向东,他向左,你就向右。
1.RACChannelTerminal *channelA = RACChannelTo(self, valueA);
2.RACChannelTerminal *channelB = RACChannelTo(self, valueB);
3.[[channelA map:
^id(NSString *value) {
4. if ([value isEqualToString:
@"西"]) {
5. return @"东";
6. }
7. return value;
8.}] subscribe:
channelB];
9.[[channelB map:
^id(NSString *value) {
10. if ([value isEqualToString:
@"左"]) {
11. return @"右";
12. }
13. return value;
14.}] subscribe:
channelA];
15.[[RACObserve(self, valueA) filter:
^BOOL(id value) {
16. return value ?
YES :
NO;
17.}] subscribeNext:
^(NSString* x) {
18. NSLog(@"你向%@", x);
19.}];
20.[[RACObserve(self, valueB) filter:
^BOOL(id value) {
21. return value ?
YES :
NO;
22.}] subscribeNext:
^(NSString* x) {
23. NSLog(@"他向%@", x);
24.}];
25.self.valueA = @"西";
26.self.valueB = @"左";
1.2015-08-15 20:
14:
46.544 Test[2440:
99901] 你向西
2.2015-08-15 20:
14:
46.544 Test[2440:
99901] 他向东
3.2015-08-15 20:
14:
46.545 Test[2440:
99901] 他向左
4.2015-08-15 20:
14:
46.545 Test[2440:
99901] 你向右
代理
你是程序员,你帮我写个app吧。
1.@protocol Programmer
2.- (void)makeAnApp;
3.@end
1.RACSignal *ProgrammerSignal =
2.[self rac_signalForSelector:
@selector(makeAnApp)
3. fromProtocol:
@protocol(Programmer)];
4.[ProgrammerSignal subscribeNext:
^(RACTuple* x) {
5. NSLog(@"花了一个月,app写好了");
6.}];
7.[self makeAnApp];
1.2015-08-15 20:
46:
45.720 Test[2817:
114564] 花了一个月,app写好了
广播
知道你的频道,我就能听到你了。
1.[[[NSNotificationCenter defaultCenter] rac_addObserverForName:
@"代码之道频道" object:
nil] subscribeNext:
^(NSNotification* x) {
2. NSLog(@"技巧:
%@", x.userInfo[@"技巧"]);
3.}];
4.[[NSNotificationCenter defaultCenter] postNotificationName:
@"代码之道频道" object:
nil userInfo:
@{@"技巧":
@"用心写"}];
1.2015-08-15 20:
41:
15.786 Test[2734:
111505] 技巧:
用心写
连接
生活是一个故事接一个故事。
1.RACSignal *signalA = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@"我恋爱啦"];
3. [subscriber sendCompleted];
4. return nil;
5.}];
6.RACSignal *signalB = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
7. [subscriber sendNext:
@"我结婚啦"];
8. [subscriber sendCompleted];
9. return nil;
10.}];
11.[[signalA concat:
signalB] subscribeNext:
^(id x) {
12. NSLog(@"%@",x);
13.}];
1.2015-08-15 12:
19:
46.707 Test[1845:
64122] 我恋爱啦
2.2015-08-15 12:
19:
46.707 Test[1845:
64122] 我结婚啦
合并
污水都应该流入污水处理厂被处理。
1.RACSignal *signalA = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@"纸厂污水"];
3. return nil;
4.}];
5.RACSignal *signalB = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
6. [subscriber sendNext:
@"电镀厂污水"];
7. return nil;
8.}];
9.[[RACSignal merge:
@[signalA, signalB]] subscribeNext:
^(id x) {
10. NSLog(@"处理%@",x);
11.}];
1.2015-08-15 12:
10:
05.371 Test[1770:
60147] 处理纸厂污水
2.2015-08-15 12:
10:
05.372 Test[1770:
60147] 处理电镀厂污水
组合
你是红的,我是黄的,我们就是红黄的,你是白的,我没变,我们是白黄的。
1.RACSignal *signalA = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@"红"];
3. [subscriber sendNext:
@"白"];
4. return nil;
5.}];
6.RACSignal *signalB = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
7. [subscriber sendNext:
@"白"];
8. return nil;
9.}];
10.[[RACSignal combineLatest:
@[signalA, signalB]] subscribeNext:
^(RACTuple* x) {
11. RACTupleUnpack(NSString *stringA, NSString *stringB) = x;
12. NSLog(@"我们是%@%@的", stringA, stringB);
13.}];
1.2015-08-15 12:
14:
19.837 Test[1808:
62042] 我们就是红黄的
2.2015-08-15 12:
14:
19.837 Test[1808:
62042] 我们是白黄的
压缩
你是红的,我是黄的,我们就是红黄的,你是白的,我没变,哦,那就等我变了再说吧。
1.RACSignal *signalA = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@"红"];
3. [subscriber sendNext:
@"白"];
4. return nil;
5.}];
6.RACSignal *signalB = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
7. [subscriber sendNext:
@"白"];
8. return nil;
9.}];
10.[[signalA zipWith:
signalB] subscribeNext:
^(RACTuple* x) {
11. RACTupleUnpack(NSString *stringA, NSString *stringB) = x;
12. NSLog(@"我们是%@%@的", stringA, stringB);
13.}];
1.2015-08-15 20:
34:
24.274 Test[2660:
108483] 我们是红白的
映射
我可以点石成金。
1.RACSignal *signal = [[RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@"石"];
3. return nil;
4.}] map:
^id(NSString* value) {
5. if ([value isEqualToString:
@"石"]) {
6. return @"金";
7. }
8. return value;
9.}];
10.[signal subscribeNext:
^(id x) {
11. NSLog(@"%@", x);
12.}];
1.2015-08-16 20:
00:
12.853 Test[740:
15871] 金
归约
糖加水变成糖水。
1.RACSignal *sugarSignal = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@"糖"];
3. return nil;
4.}];
5.RACSignal *waterSignal = [RACSignal createSignal:
^RACDisposable *(id subscriber) {
6. [subscriber sendNext:
@"水"];
7. return nil;
8.}];
9.[[RACSignal combineLatest:
@[sugarSignal, waterSignal] reduce:
^id (NSString* sugar, NSString*water){
10. return [sugar stringByAppendingString:
water];
11.}] subscribeNext:
^(id x) {
12. NSLog(@"%@", x);
13.}];
1.2015-08-16 20:
07:
00.356 Test[807:
19177] 糖水
过滤
未满十八岁,禁止进入。
1.[[[RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. [subscriber sendNext:
@(15)];
3. [subscriber sendNext:
@(17)];
4. [subscriber sendNext:
@(21)];
5. [subscriber sendNext:
@(14)];
6. [subscriber sendNext:
@(30)];
7. return nil;
8.}] filter:
^BOOL(NSNumber* value) {
9. return value.integerValue >= 18;
10.}] subscribeNext:
^(id x) {
11. NSLog(@"%@", x);
12.}];
1.2015-08-16 20:
11:
20.071 Test[860:
21214] 21
2.2015-08-16 20:
11:
20.071 Test[860:
21214] 30
扁平
打蛋液,煎鸡蛋,上盘。
1.[[[[RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. NSLog(@"打蛋液");
3. [subscriber sendNext:
@"蛋液"];
4. [subscriber sendCompleted];
5. return nil;
6.}] flattenMap:
^RACStream *(NSString* value) {
7. return [RACSignal createSignal:
^RACDisposable *(id subscriber) {
8. NSLog(@"把%@倒进锅里面煎",value);
9. [subscriber sendNext:
@"煎蛋"];
10. [subscriber sendCompleted];
11. return nil;
12. }];
13.}] flattenMap:
^RACStream *(NSString* value) {
14. return [RACSignal createSignal:
^RACDisposable *(id subscriber) {
15. NSLog(@"把%@装到盘里", value);
16. [subscriber sendNext:
@"上菜"];
17. [subscriber sendCompleted];
18. return nil;
19. }];
20.}] subscribeNext:
^(id x) {
21. NSLog(@"%@", x);
22.}];
1.2015-08-16 20:
39:
34.786 Test[1226:
34386] 打蛋液
2.2015-08-16 20:
39:
34.787 Test[1226:
34386] 把蛋液倒进锅里面煎
3.2015-08-16 20:
39:
34.787 Test[1226:
34386] 把煎蛋装到盘里
4.2015-08-16 20:
39:
34.787 Test[1226:
34386] 上菜
秩序
把大象塞进冰箱只需要三步:
打开冰箱门,把大象塞进冰箱,关上冰箱门。
1.[[[[RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. NSLog(@"打开冰箱门");
3. [subscriber sendCompleted];
4. return nil;
5.}] then:
^RACSignal *{
6. return [RACSignal createSignal:
^RACDisposable *(id subscriber) {
7. NSLog(@"把大象塞进冰箱");
8. [subscriber sendCompleted];
9. return nil;
10. }];
11.}] then:
^RACSignal *{
12. return [RACSignal createSignal:
^RACDisposable *(id subscriber) {
13. NSLog(@"关上冰箱门");
14. [subscriber sendCompleted];
15. return nil;
16. }];
17.}] subscribeCompleted:
^{
18. NSLog(@"把大象塞进冰箱了");
19.}];
1.2015-08-16 20:
45:
27.724 Test[1334:
37870] 打开冰箱门
2.2015-08-16 20:
45:
27.725 Test[1334:
37870] 把大象塞进冰箱
3.2015-08-16 20:
45:
27.725 Test[1334:
37870] 关上冰箱门
4.2015-08-16 20:
45:
27.726 Test[1334:
37870] 把大象塞进冰箱了
命令
我命令你马上投降。
1.RACCommand *aCommand = [[RACCommand alloc] initWithSignalBlock:
^RACSignal *(id input) {
2. return [RACSignal createSignal:
^RACDisposable *(id subscriber) {
3. NSLog(@"我投降了");
4. [subscriber sendCompleted];
5. return nil;
6. }];
7.}];
8.[aCommand execute:
nil];
1.2015-08-16 20:
54:
32.492 Test[1450:
41849] 我投降了
延迟
等等我,我还有10秒钟就到了。
1.[[[RACSignal createSignal:
^RACDisposable *(id subscriber) {
2. NSLog(@"等等我,我还有10秒钟就到了");
3. [subscriber sendNext:
nil];
4. [subscriber sendCompleted];
5. return nil;
6.}] delay:
10] subscribeNext:
^(id x) {
7. NSLog(@"我到了");
8.}];
1.2015-08-16 21:
00:
57.622 Test[1619:
45924] 等等我,我还有10秒钟就到了
2.2015-08-16 21:
01:
07.624 Test[1619:
45924] 我到了
重放
一次制作,多次观看。
1.RACSignal *