下载地址
OC版本下载地址ReactiveObjC
或者通过pod安装2.5版本的ReactiveCocoa
RAC中监听通知的坑
之前一直认为RAC监听通知会自动释放,网上也有很多文章讲会自动释放,结果后来通过一个bug才发现RAC监听通知不会释放观察者,需要开发者手动去释放。
解决办法:可以定义一个RACDisposable属性,在dealloc方法中移除观察者。
个人建议,在需要监听通知的时候,不推荐使用RAC!
@property (nonatomic, strong) RACDisposable *disposable;
self.disposable= [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(NSNotification *notify) {
}];
- (void)dealloc {
[self.disposable dispose];
}
项目中具体使用
在项目中第一次使用RAC是在一个小飞机的项目当中,手机和飞机通过socket建立长连接,飞机会不停的下发关于飞机的一些信息,比如说当前飞机电池电量,飞行高度,飞行距离,GPS位置等。刚开始的做法是有一个飞行数据下行模型类,然后通过kvo去监听这个模型的一堆属性,需要写一堆代码。后来引入了RAC,瞬间感觉开发效率提升了数倍,以前需要些一堆代码,现在只需要一个宏就OK了,而且RAC还提供了很多高阶函数,来对返回的数组做处理,用起来方便到了极点。
举个例子:
比如说我需要在APP界面上显示实时的飞行高度,那我只需要写下面的这一段代码就OK。
这段代码中用到了一个高阶函数distinctUntilChanged,这个函数的作用是如果这次返回的值和上次返回的值一样,那么忽略该值。可以设想一下,当前飞机是悬停状态,那么飞机的高度是不会变化的,但是飞机那边还是按0.05秒一次返回飞行高度数据,然后高度label赋值,这样做就会造成无谓的性能损耗。使用distinctUntilChanged后,就可以避免这种损耗。试想一下,你用kvo实现这个重复值过滤,需要多麻烦。
RAC(self.heightLabel, text) = [[RACObserve(self.publicData, height) distinctUntilChanged] map:^id(id value) {
return [NSString stringWithFormat:@"%.1fM",[value floatValue]];
}];
总结
1.很多人可能都是因为MVVM才知道RAC的,以为MVVM和RAC是必须要一起使用。其实完全不是这样的,MVVM没有RAC也能实现。RAC在不是MVVM的架构中也能使用,我建议学习iOS的开发者都可以用一用这个框架,感受一下它的魅力。
2.我不建议项目中所有的地方都使用RAC。我现在的项目是用MVVM和RAC的架构,我用到RAC的地方只有view和viewmodel的双向绑定。其它地方像通知,代理,点击事件这些地方都没用,我个人认为使用RAC的目的是帮我们解决开发中的痛点和难点,让我们实现快速的开发,而不是要完全引入它的api,这样就侵入性太强了。而且有想RAC监听通知不释放这样的坑,所以我个人强烈建议RAC只能适当使用.