(整个关于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. NYOJ 743

    复杂度 描述 for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) for(k=j+1;k<=n;k++) operation; 你知道 operation 共 ...

  2. [No000088]并行循环vs普通循环

    using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks ...

  3. http协议进阶(一)http概述

    参考书籍——<HTTP权威指南> 1.web客户端和服务器 http客户端发出请求,其中包含请求内容,发给服务器,服务器再返回内容中回送请求的数据,http客户端和服务器构成了万维网的基本 ...

  4. 用延迟加载解决CNZZ加载慢的问题

    我是不太喜欢CNZZ的, 不过既然公司要用, 还是得加, 这个公司不知道为什么不好好优化一下, 这么多功能都做了, 难道不愿意多费几分钟优化一下这个特别影响用户体验的统计代码? 现在的移动站页面, 是 ...

  5. bzoj 1334: [Baltic2008]Elect

    Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党 ...

  6. [web建站] 优课急送《零基础快速学习建站》视频+课件【价值399元】

    [课程介绍]你想快速建一个网站出来吗?你想从什么都不懂到一两天出一个漂漂亮亮的站吗?你想完成领导交给你的任务找人建站吗?你想自己建站来创业吗?你想学会建站之后,利用给别人建站来赚钱吗?你想建一个跟某个 ...

  7. 我也来写:数据库访问类DBHelper

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

  8. ASP.NET中的缓存机制

    ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象.缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重新启动时,将重新创建缓存. 将数据添加到缓 ...

  9. C语言学习 第四次作业总结

    本次作业主要为了复习分支语句,同时复习之前学习过的判断语句,printf和scanf函数的使用. 学习到这里,同学们应该已经基本掌握了基本的数据类型,分支结构,循环结构,条件判断语句.应该可以利用这些 ...

  10. 用CSS绘制最常见的形状和图形

    #rectangle { width: 200px; height: 100px; background: red; } #circle { width: 100px; height: 100px; ...