ReactiveCocoa源码拆分解析(六)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载)
RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅是这个,整个RAC中对宏的使用都很有学习价值。我这里简单简单的说明下,我们在实际开发中常用到的宏,有些宏我也没有研究的很透彻,就不班门弄斧了,大家可以参考下别的学习资料。
以下面的例子入手:
RAC(self.noneDataTipView,hidden) = [RACSignal combineLatest:@[bannerSignal,messageSignal] reduce:^id(NSArray *bannerArray, NSArray *messageList){
return @(bannerArray.count || messageList.count);
}];
要实现的功能很简单,就是在bannerSignal与messageSignal这两个信号传来的数组都不包含元素时,将没有内容的提示页面展示出来,当有数据之后,该页面隐藏。
我根据RAC的实现,写了一个简易版的绑定,供学习参考,RAC的实现又关联了许多其他的宏,看起来比较复杂。
QHQSubscriptingAssignmentTrampoline这个类将给我们进行绑定。
- (id)initWithTarget:(id)target;提供了一个初始化方法,需要设置一个绑定的对象,也就是绑定谁。(RAC中还有1个nilValue)
接下来我们就实现那个宏,也是见证奇迹的时刻。
#define QHQ(TARGET, KEYPATH) \
[[QHQSubscriptingAssignmentTrampoline alloc] initWithTarget:(TARGET)][KEYPATH]
什么鬼?这样就可以了?后面的[KEYPATH]是什么东西?
这其实利用了clang的新特性,允许你像访问字典一样,访问一个对象,但是!对,这是有条件的,你需要重载一个函数,可能大部分OC程序员们对重载不太了解,那么你需要自行百度一下了。
- (void)setObject:(QHQSignal *)signal forKeyedSubscript:(NSString *)keyPath;
上面的方法就是奇迹发生的地方,看看函数的命名,你也明白了,用[]这种角标的形式访问。
简单的实现了下内部(不过功能不太完整),大致思路如此
- (void)setObject:(QHQSignal *)signal forKeyedSubscript:(NSString *)keyPath {
[signal subscribeNext:^(id x) {
[self.target setValue:x forKey:keyPath];
}];
}
之后写个demo测试一下
QHQ(self.view,@"backgroundColor") = [QHQSignal createSignal:^QHQDispose *(id subscriber) {
[subscriber sendNext:[UIColor yellowColor]];
return nil;
}];
运行一下,颜色变了。RAC为了实现这一优雅的绑定,可谓付出颇多心思,对github的开发者们致敬。
补充一下RACKVOChannel这个类的宏,也是这样实现的。
最新文章
- Java实现MySQL数据库备份(二)
- Android 判断字符串是否为空
- 开始写github
- Java中对象构造
- 接入WebSocket
- 安装Office时出现windows installer服务不能更新一个或多个受保护的windows文件错误的解决方法
- QT Windows下生成动态链接库
- 怎样找Android里自带的数据库?
- mysqldump 备份直接至压缩文件,提高备份及压缩时间
- Python基础之变量
- 画布Canvas 画笔Paint
- MySQL(2)---Explain
- Python 模块(module)
- 雷林鹏分享:C# 字符串(String)
- Java 内存监控命令简介(零)
- Java面试题全集
- 初中级web前端工程师的面试题分享
- p​o​s​t​m​a​r​k​使​用
- Ddos 反射性防护 simple
- JQuery中attr属性和jQuery.data()学习笔记
热门文章
- POJ1962Corporative Network[带权并查集]
- 从LIS问题浅谈动态规划
- jdbc java数据库连接 3)Statement接口之执行DDL、DML、DQL
- android第一行代码-1.项目结构
- QString, string, int, char* 之间相互转换
- PlayMaker的应用
- 【JavaScript】操作Canvas画图
- 线段树 poj 3667
- 基于CentOS-7.2.15的Mono+jexus镜像
- JavaScript零基础学习系列四