p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #78492a; background-color: #ffffff }

ReactiveCocoa是Github开源的一个用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称。敢自称为XXXCocoa框架可以想象到这个框架的牛逼!!!膜拜......

现在分为ReactiveObjC和ReactiveSwift,两个框架的功能使用相似,本文主要介绍ReactiveObjC的简单使用,希望能对你有所帮助......

ReactiveObjC框架的简单使用

如果是第一次使用,建议先简单测试通过后,再使用...... (你懂的)

#pragma mark -- 监听事件(按钮点击)

// 把按钮点击事件UIControlEventTouchUpInside转换为信号,点击按钮,就会发送信号

[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

NSLog(@"按钮被点击了");
}];

#pragma mark -- 代替代理

// 需求:自定义redView,监听红色view中按钮点击
// 之前都是需要通过代理监听,给红色View添加一个代理属性,点击按钮的时候,通知代理做事情
// rac_signalForSelector:把调用某个对象的方法的信息转换成信号,就会调用这个方法,就会发送信号。
// 这里表示只要监听了redView的btnClick:方法。(只要redView的btnClick:方法执行了,就会执行下面的方法,并且将参数传递过来)

[[redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
NSLog(@"点击红色按钮");
}];

#pragma mark -- 代替KVO

// 把监听redView的center属性改变转换成信号,只要值改变就会发送信号
// observer:可以传入nil
[[redView rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

#pragma mark -- 代替通知

// 把监听到的通知转换信号
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] takeUntil:[self rac_willDeallocSignal]] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@", x);
}];

#pragma mark -- 监听文本框的文字改变

// 监听文本框的文字改变、获取文本框文字改变的信号
[_textField.rac_textSignal subscribeNext:^(id x) {
self.textLabel.text = x;
NSLog(@"文字改变了%@",x);
}];

#pragma mark -- 处理多个请求

// 处理多个请求,都返回结果的时候,统一做处理.
RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

// 发送请求1
[subscriber sendNext:@"发送请求1"];
return nil;
}];

RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 发送请求2
[subscriber sendNext:@"发送请求2"];
return nil;
}];

// 使用注意:几个信号,selector的方法就几个参数,每个参数对应信号发出的数据。
不需要订阅:不需要主动订阅,内部会主动订阅
[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];

// 更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1
{
NSLog(@"更新UI%@ %@",data,data1);
}

#pragma mark -- 遍历数组

// 1.遍历数组
NSArray *numbers = @[@1,@2,@3,@4];

// 这里其实是三步(底层已经封装好了,直接使用就行)
// 第一步: 把数组转换成集合RACSequence numbers.rac_sequence
// 第二步: 把集合RACSequence转换RACSignal信号类,numbers.rac_sequence.signal
// 第三步: 订阅信号,激活信号,会自动把集合中的所有值,遍历出来。
[numbers.rac_sequence.signal subscribeNext:^(id x) {

// NSLog(@"%@",x);
}];

***********************************************RAC常用宏*****************************************

#pragma mark--KVO

RACObserve(就是一个宏定义):快速的监听某个对象的某个属性改变
监听self.view的center属性,当center发生改变的时候就会触发NSLog方法

[RACObserve(self.view, center) subscribeNext:^(id x) {
NSLog(@"%@", x);
}];

#pragma mark--登录按钮的状态实时监听

RAC(_loginButton, enabled) = [RACSignal combineLatest:@[_username.rac_textSignal, _password.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){
return @(username.length && password.length);
}];

#pragma mark--循环引用

// @weakify() 宏定义
@weakify(self) //相当于__weak typeof(self) weakSelf = self;
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
@strongify(self)  //相当于__strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"%@",self.view);
return nil;
}];
_signal = signal;

实际开发遇到的坑

一: "引用循环"是肯定会出现的,因此一定要避免"强引用循环"

解决方案:一端使用strong一端使用weak

二: 出现下面的错误:

 

解决办法:所有控件在使用RAC之前一定要先初始化!先初始化!先初始化!

(Masonry框架:布局之前一定要添加到父控件中)有相似之处

更多内容--> 博客导航 每周一篇哟!!!

有任何关于iOS开发的问题!欢迎下方留言!!!或者邮件lieryangios@126.com 虽然我不一定能够解答出来,但是我会请教iOS开发高手!!!解答您的问题!!!

最新文章

  1. jQuery 获取父窗口的元素 父窗口 子窗口(iframe)
  2. [推荐]DDOS攻击与防范知识介绍
  3. BZOJ1576 (最短路+并查集)
  4. 【转】部署web项目到weblogic上启动错误
  5. JavaScript触摸与手势事件
  6. 今天收到报警邮件,提示网站502 bad gateway,
  7. PHP上传图片
  8. SSH的整合
  9. 【记录一次坑经历】axios使用x-www-form-urlencoded 服务器报400(错误的请求。 )(后端.Net MVC5 WebApi OAuth,前端Electron-Vue)
  10. Mycat的分库分表
  11. @Configuration的使用
  12. SQLite保存报错sqlite.SQLiteConstraintException: UNIQUE constraint failed: &#183;&#183;&#183;&#183;&#183;&#183; code 1555
  13. VR外包AR外包公司(虚拟现实外包公司)承接虚拟现实项目开发(企业、教育、游戏)
  14. 一圖讓你看懂javascript原型鏈
  15. Spring AOP 切面实现操作日志
  16. KVM资源划分分配技巧
  17. flink和spark stream等框架的对比
  18. Python3.x:自动生成IP写入文本
  19. spring boot 2.x拦截器导致静态资源404终极解决办法
  20. Mac下Java JNI 调C

热门文章

  1. 搜索技术---solr
  2. 【收藏】15个常用的javaScript正则表达式
  3. Python 随机生成有效手机号码及身份证
  4. SCAU Individual Contest #1
  5. (中级篇 NettyNIO编解码开发)第六章-编解码技术
  6. C# MVC权限验证
  7. Identity Service - 解析微软微服务架构eShopOnContainers(二)
  8. 写markdown博客如何截图并快速上传到图床——记一个工具插件的实现
  9. 关于饿了么在浏览器标签页失去焦点时网页Title改变的实现方法
  10. Boosting决策树:GBDT