ReactiveCocoa之RAC映射(七)
2016-05-23 11:47
459 查看
- (void)map { // Map使用步骤: // 1.传入一个block,类型是返回对象,参数是value // 2.value就是源信号的内容,直接拿到源信号的内容做处理 // 3.把处理好的内容,直接返回就好了,不用包装成信号,返回的值,就是映射的值。 // Map底层实现: // 0.Map底层其实是调用flatternMap,Map中block中的返回的值会作为flatternMap中block中的值。 // 1.当订阅绑定信号,就会生成bindBlock。 // 3.当源信号发送内容,就会调用bindBlock(value, *stop) // 4.调用bindBlock,内部就会调用flattenMap的block // 5.flattenMap的block内部会调用Map中的block,把Map中的block返回的内容包装成返回的信号。 // 5.返回的信号最终会作为bindBlock中的返回信号,当做bindBlock的返回信号。 // 6.订阅bindBlock的返回信号,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。 // Map作用:把源信号的值映射成一个新的值 // 创建信号 RACSubject *subject = [RACSubject subject]; // 绑定信号 RACSignal *bindSignal = [subject map:^id(id value) { // 返回的类型就是你需要映射的值 return [NSString stringWithFormat:@"ws:%@", value]; //这里将源信号发送的“123” 前面拼接了ws: }]; // 订阅绑定信号 [bindSignal subscribeNext:^(id x) { NSLog(@"%@", x); }]; // 发送信号 [subject sendNext:@"123"]; } /* FlatternMap和Map的区别 1.FlatternMap中的Block返回信号。 2.Map中的Block返回对象。 3.开发中,如果信号发出的值不是信号,映射一般使用Map 4.开发中,如果信号发出的值是信号,映射一般使用FlatternMap。 */ - (void)flatMap { // 创建信号 RACSubject *subject = [RACSubject subject]; // 绑定信号 RACSignal *bindSignal = [subject flattenMap:^RACStream *(id value) { // block:只要源信号发送内容就会调用 // value: 就是源信号发送的内容 // 返回信号用来包装成修改内容的值 return [RACReturnSignal return:value]; }]; // flattenMap中返回的是什么信号,订阅的就是什么信号(那么,x的值等于value的值,如果我们操纵value的值那么x也会随之而变) // 订阅信号 [bindSignal subscribeNext:^(id x) { NSLog(@"%@", x); }]; // 发送数据 [subject sendNext:@"123"]; } - (void)flattenMap2 { // flattenMap 主要用于信号中的信号 //signalOfsignals用FlatternMap // 创建信号 RACSubject *signalofSignals = [RACSubject subject]; RACSubject *signal = [RACSubject subject]; // 订阅信号 //方式1 // [signalofSignals subscribeNext:^(id x) { // // [x subscribeNext:^(id x) { // NSLog(@"%@", x); // }]; // }]; // 方式2 // [signalofSignals.switchToLatest ]; // 方式3 // RACSignal *bignSignal = [signalofSignals flattenMap:^RACStream *(id value) { // // //value:就是源信号发送内容 // return value; // }]; // [bignSignal subscribeNext:^(id x) { // NSLog(@"%@", x); // }]; // 方式4--------也是开发中常用的 [[signalofSignals flattenMap:^RACStream *(id value) { return value; }] subscribeNext:^(id x) { NSLog(@"%@", x); }]; // 发送信号 [signalofSignals sendNext:signal]; [signal sendNext:@"123"]; }
相关文章推荐
- ReactiveCocoa之RACMulticastConnection使用(六)
- ReactiveCocoa之RACCommand使用(五)
- ReactiveCocoa之RACSubject用法(四)
- ReactiveCocoa之RACSignal核心类的使用(三)
- ReactiveCocoa之常见用法(二)
- React-native debug errors
- 离线安装Chrome扩展程序
- ReactiveCocoa之简介(一)
- 响应式编程框架ReactiveCocoa学习——框架概览
- React Native学习笔记(二)JSX 语法学习
- Reacting to rumors
- React Native 安装开发环境及如何编写Hello World程序
- 响应式编程框架ReactiveCocoa学习——基本操作符
- ReactiveCocoa之进阶篇
- ReactiveCocoa之基础
- ZOJ2314Reactor Cooling(无源汇上下界可行流)
- 跟angular2学一键开启项目--关于上个react-redux项目的一键调试
- 响应式编程框架ReactiveCocoa介绍与入门
- React Native的原生路由
- CSS Modules 关于CSS模块化的方法 基于React