临别前给小伙伴的RAC培训
问题是:这就是MVC的全部吗?
显然不是,这实际上只是iOS上的MVC而不是MVC的完整概念。
ReactiveCocoa的出现
ReactiveCocoa是由Github团队开源的一个框架级的项目。这个玩意就是将大家带进了iOS的FRP(Functional Reactive Programming)时代,上面MVC中的M和V的绑定,就可以通过RAC去轻松实现了。当然,数据绑定只是其中一个基本的特性,其中事件流的响应还可以有各种的加工处理。RAC中的流通基本单位就是Signal,通过不断流通Signal来实现了整个响应式的链条。简单总结一下,就是RAC用它这种Signal的模式,把iOS开发常用的KVO、delegate、target等常用模式,都统一起来。
ReactiveCocoa的缺点
- 和传统的开发认知相差甚远,会让使用者怀疑人生
- 学习曲线陡峭得有点猥琐
- 方法命名魔性不友好
- 调用堆栈层次深不见底,debug难度加大
- 使用时必须时刻注意引用问题
- 据说过于复杂的事件流会影响性能(未遇到过)
- 框架级代码,不是每个人都能接受
ReactiveCocoa基本概念
信号(Signal):也就是流,RAC中所有的信号都是 RACStream 的子类。信号有冷热之分,信号也有中继、改变等操作。信号是让订阅者去订阅,然后触发对应事件。
- 冷信号(怎么处理冷信号与热信号 Cold):就是什么事情也不干的,没有订阅者的时候则是这种状态。
- 热信号(Hot):已经有了订阅者就会激活为热信号,同时持有对应的订阅block,在complete之前都不会释放。
订阅者(Subscriber)怎么处理冷信号与热信号 :负责接收信号执行操作,都必须实现 RACSubscriber 协议。订阅者之间的关系原则上是平等的,但实际操作上也是有先后顺序,而且还有副作用的情况需要考虑。
副作用(Side Effect):在每一次订阅的是时候都会触发对应的操作,导致订阅者收到信号的时候,结果会和其他订阅者不同。
RAC基本入门
创建最基本的信号
- id subscriber ,这就是所谓的订阅者,我们需要把结果传给它,由它来负责把结果分发到所有的订阅者去。如: [subscriber sendNext:@"成功"] 。
- RACDisposable * ,返回这类对象是为了在取消订阅的时候可以执行相关的操作。
只有通过subscribe,或Signal Operation的时候,信号才会真正执行。好的,那现在 x 的结果是什么?
RAC最大的特性就是优雅的数据绑定方式。在传统的KVO中API过于猥琐,用的人基本都得写 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 这个奇丑无比的方法(特别是那个context)。当然KVO的功能还是强大的,引用一下文档的描述:
This message is sent to the receiver when the value at the specified key path relative to the given object has changed.
本质也就是通过截取相关setter来实现的,所以类似 _name = newName 这种直接针对成员变量赋值的操作就不要妄想可以使用KVO了。有点扯远了,拉回正题,RAC的数据绑定就是基于KVO的。因此,如果某个property不支持KVO的话,RAC也是无能为力的(目前无解决办法,至于如何得知是否支持KVO?你猜?)。
好的,这就已经写完数据绑定了。上面是一个单向绑定的例子,目的就是 self 的 isEditing 的值直接绑定到 self.viewModel 的 isEditing 。也就是是说 self.viewModel 的 isEditing 改变时,会直接赋值到 self 的 isEditing 上去。首次绑定的时候, self 的 isEditing 会被改为后者的值。
这里RAC和RACObserve干了些什么暂时不作解释了,接着说。
我们的关系忽冷忽热 -变心的3种信号
男生小蔡,苦追女神5个月,终于修成正果,在追求女神的过程中早饭送到手,下雨站门口,事无巨细地为女神做好一切,成为男女朋友的第一个月小蔡还是照常贴心地为女朋友做着很多事,同事、朋友都笑话他“舔狗”、“备胎转正”,慢慢地他觉得心里不平衡,都已经是自己女朋友了,凭什么都是自己付出,他让要女朋友知道自己的价值,所以在之后的相处中,他故意迟回消息、对女友忽冷忽热,女友刚开始以为是自己的问题,就跟小蔡主动说由于太忙忽略了小蔡的感受,小蔡突然发现对女友“忽冷忽热”反而让自己在感情上占领高地,隔段时间就故技重施,女友也察觉到小蔡的情绪反复、忽冷忽热,想要跟小蔡好好聊聊,小蔡扔下一句“没时间,要打游戏”,就因为这一句话,女友坚决提分手。小蔡和女友最大的问题——回避问题,小蔡内心很在意别人对自己的评价,他不主动去面对问题告知同事这样评价对自己的伤害,也不主动地向女友倾诉这些评价给自己造成的困扰,用回避问题的方式转为对女友的“冷暴力”,直白地讲小蔡解决感情的问题过于简单、幼稚、单一,并且也全盘否定了女友对他的认可和包容,在伤害对方的同时也在伤害自己。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.
怎么处理冷信号与热信号
1、无纸记录仪U盘在计算机上无法读取数据,U盘已经有存储。U盘也已经格式化。
答:U盘数据需用答:上位机的软件的U盘工具读取后,才有历史数据及曲线可查询。
临别前给小伙伴的RAC培训
问题是:这就是MVC的全部吗?
显然不是,这实际上只是iOS上的MVC而不是MVC的完整概念。
ReactiveCocoa的出现
ReactiveCocoa是由Github团队开源的一个框架级的项目。这个玩意就是将大家带进了iOS的FRP(Functional Reactive Programming)时代,上面MVC中的M和V的绑定,就可以通过RAC去轻松实现了。当然,数据绑定只是其中一个基本的特性,其中事件流的响应还可以有各种的加工处理。RAC中的流通基本单位就是Signal,通过不断流通Signal来实现了整个响应式的链条。简单总结一下,就是RAC用它这种Signal的模式,把iOS开发常用的KVO、delegate、target等常用模式,都统一起来。
ReactiveCocoa的缺点
- 和传统的开发认知相差甚远,会让使用者怀疑人生 怎么处理冷信号与热信号
- 学习曲线陡峭得有点猥琐
- 方法命名魔性不友好
- 调用堆栈层次深不见底,debug难度加大
- 使用时必须时刻注意引用问题
- 据说过于复杂的事件流会影响性能(未遇到过)
- 框架级代码,不是每个人都能接受
ReactiveCocoa基本概念
信号(Signal):也就是流,RAC中所有的信号都是 RACStream 的子类。信号有冷热之分,信号也有中继、改变等操作。信号是让订阅者去订阅,然后触发对应事件。
- 冷信号(Cold):就是什么事情也不干的,没有订阅者的时候则是这种状态。
- 热信号(Hot):已经有了订阅者就会激活为热信号,同时持有对应的订阅block,在complete之前都不会释放。
订阅者(Subscriber):负责接收信号执行操作,都必须实现 RACSubscriber 协议。订阅者之间的关系原则上是平等的,但实际操作上也是有先后顺序,而且还有副作用的情况需要考虑。
副作用(Side Effect):在每一次订阅的是时候都会触发对应的操作,导致订阅者收到信号的时候,结果会和其他订阅者不同。
RAC基本入门
创建最基本的信号
- id subscriber ,这就是所谓的订阅者,我们需要把结果传给它,由它来负责把结果分发到所有的订阅者去。如: [subscriber sendNext:@"成功"] 。
- RACDisposable * ,返回这类对象是为了在取消订阅的时候可以执行相关的操作。
只有通过subscribe,或Signal Operation的时候,信号才会真正执行。好的,那现在 x 的结果是什么?
RAC最大的特性就是优雅的数据绑定方式。在传统的KVO中API过于猥琐,用的人基本都得写 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)怎么处理冷信号与热信号 object change:(NSDictionary *)change context:(void *)context 这个奇丑无比的方法(特别是那个context)。当然KVO的功能还是强大的,引用一下文档的描述:
This message is sent to the receiver when the value at the specified key path relative to the given object has changed.
怎么处理冷信号与热信号
本质也就是通过截取相关setter来实现的,所以类似 _name = newName 这种直接针对成员变量赋值的操作就不要妄想可以使用KVO了。有点扯远了,拉回正题,RAC的数据绑定就是基于KVO的。因此,如果某个property不支持KVO的话,RAC也是无能为力的(目前无解决办法,至于如何得知是否支持KVO?你猜?)。
好的,这就已经写完数据绑定了。上面是一个单向绑定的例子,目的就是 self 的 isEditing 的值直接绑定到 self.viewModel 的 isEditing 。也就是是说 self.viewModel 的 isEditing 改变时,会直接赋值到 self 的 isEditing 上去。首次绑定的时候, self 的 isEditing 会被改为后者的值。
这里RAC和RACObserve干了些什么暂时不作解释了,接着说。