(整个关于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这个类的宏,也是这样实现的。

ReactiveCocoa源码拆分解析(六)的更多相关文章

  1. ReactiveCocoa源码拆分解析(一)

    (整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载) ReactiveCocoa的介绍我就不说了,可以自行百度 ...

  2. ReactiveCocoa源码拆分解析(二)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...

  3. ReactiveCocoa源码拆分解析(四)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...

  4. ReactiveCocoa源码拆分解析(七)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...

  5. ReactiveCocoa源码拆分解析(五)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...

  6. ReactiveCocoa源码拆分解析(三)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 这一章节主要讨论信号的“冷”与“热” 在RAC的世界 ...

  7. Spring源码分析(六)解析和注册BeanDefinitions

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 当把文件转换为Document后,接下来的提取及注册bean就是我们的重 ...

  8. Spring框架之spring-web web源码完全解析

    Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...

  9. Retrofit源码设计模式解析(下)

    本文将接着<Retrofit源码设计模式解析(上)>,继续分享以下设计模式在Retrofit中的应用: 适配器模式 策略模式 观察者模式 单例模式 原型模式 享元模式 一.适配器模式 在上 ...

随机推荐

  1. 第18章 集合框架(2)-Set接口

    第18章 集合框架(2)-Set接口 Set是Collection子接口,模拟了数学上的集的概念 Set集合存储特点 1.不允许元素重复 2.不会记录元素的先后添加顺序 Set只包含从Collecti ...

  2. Spring中的JDK动态代理

    Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...

  3. MATLAB常用字符串函数之二

    1,lower和upper lower: 将包含的全部字母转换为小写. upper: 将包含的全部字母转化为大写. 实例一: >>str='Sophia is a good girl.'; ...

  4. C++学习笔记(2)

    本学习笔记是C++ primer plus(第六版)学习笔记.是C++学习笔记(1)的后续.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p ...

  5. 直接启动tomcat时为tomcat指定JDK

    第一种: 在windows环境下以批处理文件方式启动tomcat,只要运行<CATALINA_HOME>/bin/startup.bat这个文件,就可以启动Tomcat.在启动时,star ...

  6. 非对称加密算法RSA

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当时他们 ...

  7. 【JavaScript】【CSS】前端规则摘抄

    源:http://zhibimo.com

  8. u盘安装系统教程详解

    一.准备阶段 提前准备一个至少1G或以上的u盘,方便好用. 1.制作u盘启动工具 (1)工具下载,推荐IT天空的优启通 下载地址:https://www.itiankong.net/thread-37 ...

  9. 正则表达式解析url参数

    解析url参数正则:(?<=\?|&)[\w\={}\\\\,-:'\s'""]*(?=[^#\s]|) 意思是(?<=\?|&) 从?或&符号 ...

  10. SpringBoot源码解析:tomcat启动分析

    >> spring与tomcat的启动分析:war包形式 tomcat:xml加载规范 1.contex-param: 初始化参数 2.listener-class: contextloa ...