ReactiveCocoa源码拆分解析(七)
2016-02-15 09:58
609 查看
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载)
在这篇博客中,我将把ReactiveCocoa中的擦作符做具体的介绍,附上对应的应用场景,是持续更新的。如果有的场景不合适,或者有更好的使用场景,可以留言,我会改进的。
拼接两个信号,合成的信号,在self发送sendCompleted后,发送新signal的值。
实际案例:在RACSequence这里比较有用,其他场景一时没有想到。比如需要拼接两个数组,那么可以使用concat。
压缩两个信号,这个函数的命名很有意思,zip是拉链的意思,确实功能跟拉链比较相似,只有在两个信号都有值发送时,每次取各自信号的对应下标的值,就像拉链一样,如果要拉的话,必需保证都有接下来呢的链,且需要对应。
实际案例:页面中包含两部分,上面时banner,下面的列表数据,当两个数据源都没有数据时,那么在页面上显示一个没有数据的提示页面。那么可以将两个信号进行压缩
然后zip一下,将zip返回的元组
这么作不太好,甚至会出现一些错误,你需要保证刷新数据的次数一致(像拉链一样)才能正常工作。下面我会介绍这种场景的更好实现。
这个函数算是比较高级的操作符了,是将信号流进行合并操作的,高级的地方在于第一个信号传递来的是一个函数(block),而其他信号传递来的值,则传递到函数中去执行,最后返回一个结果。
实际案例:计算器。
可以看到,第一个信号是个操作符,然后操作符左边的值信号,操作符右边值信号。首先传递了一个加法操作符,传递了值。获得输出30,当用户点击了减号按钮时,可以传递一个减号操作符,也就是上面最后一个。
在这篇博客中,我将把ReactiveCocoa中的擦作符做具体的介绍,附上对应的应用场景,是持续更新的。如果有的场景不合适,或者有更好的使用场景,可以留言,我会改进的。
拼接
- (RACSignal *)concat:(RACSignal *)signal;
拼接两个信号,合成的信号,在self发送sendCompleted后,发送新signal的值。
实际案例:在RACSequence这里比较有用,其他场景一时没有想到。比如需要拼接两个数组,那么可以使用concat。
压缩
- (RACSignal *)zipWith:(RACSignal *)signal;
压缩两个信号,这个函数的命名很有意思,zip是拉链的意思,确实功能跟拉链比较相似,只有在两个信号都有值发送时,每次取各自信号的对应下标的值,就像拉链一样,如果要拉的话,必需保证都有接下来呢的链,且需要对应。
实际案例:页面中包含两部分,上面时banner,下面的列表数据,当两个数据源都没有数据时,那么在页面上显示一个没有数据的提示页面。那么可以将两个信号进行压缩
RACSignal *bannerSignal = RACObserve(self.viewModel, bannerList).distinctUntilChanged.replayLazily; RACSignal *listSignal = RACObserve(self.viewModel, messageList).distinctUntilChanged.replayLazily;
然后zip一下,将zip返回的元组
RAC(self.noneDataTipView,hidden) = [[bannerSignal zipWith:listSignal] map:^id(id value) { return @(1); }];
这么作不太好,甚至会出现一些错误,你需要保证刷新数据的次数一致(像拉链一样)才能正常工作。下面我会介绍这种场景的更好实现。
应用压缩
- (RACSignal *)reduceApply;
这个函数算是比较高级的操作符了,是将信号流进行合并操作的,高级的地方在于第一个信号传递来的是一个函数(block),而其他信号传递来的值,则传递到函数中去执行,最后返回一个结果。
实际案例:计算器。
RACReplaySubject *operator = [RACReplaySubject subject]; RACReplaySubject *leftHandSideValue = [RACReplaySubject subject]; RACReplaySubject *rightHandSideValue = [RACReplaySubject subject]; [[[RACSignal combineLatest:@[operator,leftHandSideValue,rightHandSideValue]] reduceApply] subscribeNext:^(id x) { NSLog(@"%@",x); }]; [operator sendNext:^id(NSNumber *a,NSNumber *b){ return @(a.integerValue + b.integerValue); }]; [leftHandSideValue sendNext:@(10)]; [rightHandSideValue sendNext:@(20)]; [operator sendNext:^id(NSNumber *a,NSNumber *b){ return @(a.integerValue - b.integerValue); }];
可以看到,第一个信号是个操作符,然后操作符左边的值信号,操作符右边值信号。首先传递了一个加法操作符,传递了值。获得输出30,当用户点击了减号按钮时,可以传递一个减号操作符,也就是上面最后一个。
相关文章推荐
- React-Native学习指南
- React Native控件之PullToRefreshViewAndroid下拉刷新组件讲解(20)
- 把REACT-NATIVE需要的安装程序都打了个包,就不用网上下了
- React Native超棒的LayoutAnimation(布局动画)
- React Native-9.React Native Touchable组件详解
- [Redux] Generating Containers with connect() from React Redux (FooterLink)
- [Redux] Generating Containers with connect() from React Redux (AddTodo)
- React JSX语法说明
- React Native 开发。
- React-Native首次运行提示-ReferenceError-Can-t-find-variable-fbBatchedBridge
- [Redux] Generating Containers with connect() from React Redux (VisibleTodoList)
- [Redux] Passing the Store Down with <Provider> from React Redux
- React Native之Android应用开发IDE选项
- react-native环境配置——Android工程搭建
- ReactiveCocoa之基础篇
- ReactNative的编码规范造成的报错问题
- react-native之旅-1.安装
- reactjs学习笔记1
- React Native 之 main.jsbundle生成方法
- React Native-目前最火的前端技术