图解ReactiveCocoa基本函数
2016-10-10 18:04
78 查看
本文讨论仅限于ReactiveCocoa v2.5
关于函数响应式编程(FRP),可以参考
What is (functional) reactive programming?
Specification for a Functional Reactive Programming language
Streams of values over time
ReactiveCocoa repo上最简单的一句话对FRP做了本质的描述,而repo本身提供的是APIs of composing and transforming streams of values,而Streams of values的抽象在ReactiveCocoa中应该是RACStream,而要composing and transforming是本文想要描述的核心内容。
先解释ReactiveCocoa中的两个基本概念
信号(Signal) a signal is a steam of values,signals can be transformed, combined,etc.
订阅者(Subscriber) a subscriber subscribes to a signal. RAC lets blocks,objects, and properties subscribe to signals
关于函数响应式编程(FRP),可以参考
What is (functional) reactive programming?
Specification for a Functional Reactive Programming language
Streams of values over time
ReactiveCocoa repo上最简单的一句话对FRP做了本质的描述,而repo本身提供的是APIs of composing and transforming streams of values,而Streams of values的抽象在ReactiveCocoa中应该是RACStream,而要composing and transforming是本文想要描述的核心内容。
先解释ReactiveCocoa中的两个基本概念
信号(Signal) a signal is a steam of values,signals can be transformed, combined,etc.
订阅者(Subscriber) a subscriber subscribes to a signal. RAC lets blocks,objects, and properties subscribe to signals
filter
RACSignal *signal = [@[ @1, @2, @3 ] rac_sequence].signal; signal = [signal filter:^BOOL(NSNumber *value) { return value.integerValue % 2; }]; [signal subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }];
map
RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal; RACSignal *signal2 = [@[ @4, @5 ] rac_sequence].signal; [[signal1 merge:signal2] subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }];
merge
RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal; RACSignal *signal2 = [@[ @4, @5 ] rac_sequence].signal; [[signal1 merge:signal2] subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }];
combineLatest
RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal; RACSignal *signal2 = [@[ @3, @4 ] rac_sequence].signal; [[signal1 combineLatestWith:signal2] subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }];
combineLatest & reduce
RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal; RACSignal *signal2 = [@[ @3, @4 ] rac_sequence].signal; [[[signal1 combineLatestWith:signal2] reduceEach:^id(NSNumber *v1, NSNumber *v2) { return @(v1.integerValue * v2.integerValue); }] subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }];
flatten
RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal; RACSignal *signal2 = [RACSignal return:signal1]; [[signal2 flatten] subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }];
flattenMap
RACSignal *signal = [@[ @1, @2 ] rac_sequence].signal; [[signal flattenMap:^RACStream *(NSNumber *value) { return [RACSignal return:@(value.integerValue * 2)]; }] subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }];
not replay
RACSubject *letters = [RACSubject subject]; RACSignal *signal = letters; [signal subscribeNext:^(id x) { NSLog(@"S1: %@", x); }]; [letters sendNext:@"A"]; [letters sendNext:@"B"]; [signal subscribeNext:^(id x) { NSLog(@"S2: %@", x); }]; [letters sendNext:@"C"];
replay
RACSubject *letters = [RACReplaySubject subject]; RACSignal *signal = letters; [signal subscribeNext:^(id x) { NSLog(@"S1: %@", x); }]; [letters sendNext:@"A"]; [signal subscribeNext:^(id x) { NSLog(@"S2: %@", x); }]; [letters sendNext:@"B"]; [signal subscribeNext:^(id x) { NSLog(@"S3: %@", x); }]; [letters sendNext:@"C"];
replayLast
RACSubject *letters = [RACSubject subject]; RACSignal *signal = [letters replayLast]; [signal subscribeNext:^(id x) { NSLog(@"S1: %@", x); }]; [letters sendNext:@"A"]; [signal subscribeNext:^(id x) { NSLog(@"S2: %@", x); }]; [letters sendNext:@"B"]; [signal subscribeNext:^(id x) { NSLog(@"S3: %@", x); }]; [letters sendNext:@"C"];
replayLazily
RACSubject *letters = [RACSubject subject]; RACSignal *signal = [letters replayLazily]; [letters sendNext:@"A"]; [signal subscribeNext:^(id x) { NSLog(@"S1: %@", x); }]; [letters sendNext:@"B"]; [signal subscribeNext:^(id x) { NSLog(@"S2: %@", x); }]; [letters sendNext:@"C"]; [signal subscribeNext:^(id x) { NSLog(@"S3: %@", x); }]; [letters sendNext:@"D"];
zip
RACSubject *letters = [RACSubject subject]; RACSubject *numbers = [RACSubject subject]; RACSignal *combined = [RACSignal zip:@[ letters, numbers ] reduce:^(NSString *letter, NSString *number) { return [letter stringByAppendingString:number]; }]; // Outputs: A1 B2 C3 [combined subscribeNext:^(id x) { NSLog(@"%@", x); }]; [letters sendNext:@"A"]; [letters sendNext:@"B"]; [letters sendNext:@"C"]; [numbers sendNext:@"1"]; [numbers sendNext:@"2"]; [numbers sendNext:@"3"];
相关文章推荐
- Windows-DB2 9.7安装图解
- 图解Flex开发教程
- JVM内存回收知识点图解(二)
- 对SQL server 2005安装步骤的理解(含图解)
- 类的初始化内存图解
- 图解DHCP的4步租约过程
- Andorid aapt 命令~图解
- 从头来之【图解针对虚拟机iOS开发环境搭建】
- 最小生成树的两种算法图解(Kruskal与prim)
- css中float left与float right clear的原理使用说明图解
- 图解数据结构(4)——二分法查找法
- SourceTree使用图解-Git项目开发
- AHCI驱动下载与手动安装图解
- 图解OPNET项目的创建过程
- 二维数组的定义内存图解
- ps图层混合模式图解实例篇
- Windows Server 2008 (图解)安装详细流程
- git 新手使用图解
- HTML与CSS(图解5):表单
- 图解Java体系结构