RAC <三> 循环引用的解决

与世无争的帅哥 提交于 2020-08-05 05:13:13

比起上一篇,更简单的写法: //更简洁的写法 信号三部曲 创建 发送 订阅

[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { NSLog(@"Here I am!"); [subscriber sendNext:@"This is RAC"]; return nil; }] subscribeNext:^(id _Nullable x) { NSLog(@"x的内容是:%@",x); }];

苹果有自己的事件处理和一些监听机制为什么不用,非要用RAC?
利用RAC处理事件方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中的:高聚合,低耦合的思想。

比较有意思和有用的例子: [[self.testTextField rac_textSignal] subscribeNext:^(NSString * _Nullable x) { NSLog(@"x信号内容:%@",x); }]; 输入框输入什么,就打印什么,时时监听,这样写 直观 简单。比写代理或者单独加一个方法监听要好点。

[[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(__kindof UIControl * _Nullable x) {
    NSLog(@"x信号内容:%@",x);
}];

点击按钮,打印出来的内容: 2017-08-21 23:22:12.786565+0800 RAC001[57966:5677758] x信号内容:<UIButton: 0x7ff5db202ca0; frame = (163 240; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x6000026f47a0>> 2017-08-21 23:22:22.595820+0800 RAC001[57966:5677758] x信号内容:<UIButton: 0x7ff5db202ca0; frame = (163 240; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x6000026f47a0>>

通知的例子,程序切换到后台 : [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) { NSLog(@"x信号内容:%@",x); }]; x信号内容:NSConcreteNotification 0x600000851f80 {name = UIApplicationDidEnterBackgroundNotification; object = <UIApplication: 0x7fd651601b90>} RAC写的通知不用remove,不用注销。

RAC优点:
写起来很方便,用了就回不去了,也会变懒,有的地方也就慢慢遗忘了,都被框架做了,比如通知不用自己remove啥的. 
RAC缺点:
刚接触 RAC 看到流水线代码感觉很头大。

RAC 里的循环引用,传统的用 weakself, RAC里面解决循环引用的话用 @weakify(self); 框架的提供。 block里面要接着 @strongify(self)

 

RAC里最大的坑就是 self, 一旦在block里面,你就千万一定不要去使用 self. 否则就要 在block外面 @weakify(self) 在里面 @strongify(self)。

循环引用单独会写几篇博客分析,这里先不做太多解释,先知道有这样的处理方式。

如果给别人审核代码的时候,最先看的就是 block里是否用了self,如果用了的话 有没有用上面两个词去修饰。

外面一个 weakify是为了打断我们的循环引用。

里面strongify 的原因是 一般里面控制器A有一个 block ,另外一个控制器C有个队列去调用 它的 block,万一 A 控制器已经被销毁掉 Block已经跟着消失了,但是 并不希望block 消失,希望能存在,所以在里面又用了strongify.

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!