ReactiveCocoa(二)
前言
通过ReactiveCocoa(一)的学习,相信大家对ReactiveCocoa有了一些基本认识吧。下面就让我们来学习ReactiveCocoa的一些基本使用吧!
ReactiveCocoa基本使用
代替代理
在ReactiveCocoa(一)中讲到可以通过RACSubject
代替代理,我们也可以通过rac_signalForSelector
同样代替代理。
代码演练
// 需求:自定义redView,监听红色view中按钮点击
// 之前都是需要通过代理监听,给红色View添加一个代理属性,点击按钮的时候,通知代理做事情
// rac_signalForSelector:把调用某个对象的方法的信息转换成信号,就要调用这个方法,就会发送信号。
// 这里表示只要redV调用btnClick:,就会发出信号,订阅就好了。
[[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
NSLog(@"点击红色按钮");
}];
代替KVO
rac_valuesAndChangesForKeyPath:
用于监听某个对象的某个属性发生变化。
代码演练
// 需求:每点击一次,年龄增加一次
// 定义一个age属性
- (void)obserVer {
[[self rac_valuesForKeyPath:@"age" observer:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.age ++;
}
监听事件
rac_signalForControlEvents:
用于监听某个事件。
代码演练
// 把按钮点击事件转化成信号,点击按钮,就会发送信号
[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"监听按钮点击事件");
}];
代替通知
rac_addObserverForName:
用于监听某个通知。
代码演练
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
NSLog(@"弹出键盘");
}];
监听文本框文字改变
rac_textSignal:
用于监听文本框文字发生改变
代码演练
[[self.textField rac_textSignal] subscribeNext:^(id x) {
NSLog(@"text:%@",x);
}];
处理当界面有多个请求时,需要都获取到数据,才能展示界面
rac_liftSelector:withSignalsFromArray:Signals:
当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发selector参数的方法。
注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据,否则运行时会报错。
代码演练
- (void)test{
// 创建信号A
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"数据请求1");
[subscriber sendNext:@"发送请求1回来的数据"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"随便写写");
}];
}];
// 创建信号B
RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"数据请求2");
[subscriber sendNext:@"发送请求2回来的数据"];
return nil;
}];
// RAC:就可以判断两个信号有没有都发出内容
// SignalsFromArray:监听哪些信号的发出
// 当signals数组中的所有信号都发送sendNext就会触发方法调用者(self)的selector
// 注意:selector方法的参数不能乱写,有几个信号就对应几个参数
// 不需要主动订阅signalA,signalB,方法内部会自动订阅
[self rac_liftSelector:@selector(doneNextWithA:andB:) withSignalsFromArray:@[signalA,signalB]];
}
- (void)doneNextWithA:(NSString *)a andB:(NSString *)b {
NSLog(@"请求完成,更新UI--a:%@,b:%@",a,b);
}
ReactiveCocoa常见宏
RAC(TARGET, ...)
用于给某个对象的某个属性绑定。
// 只要文本框文字改变,就会修改label的文字
RAC(self.labelView,text) = _textField.rac_textSignal;
RACObserve(TARGET,KEYPATH)
监听某个对象的某个属性,返回的是信号
[RACObserve(self, age) subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
@weakify(Obj)和@strongify(Obj)
一般都是成对出现,为了避免引起循环引用导致内存泄漏的,和block的使用类似。
@weakify(self);
[[_redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
@strongify(self);
NavViewController *navVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:NSStringFromClass([NavViewController class])];
[self.navigationController pushViewController:navVC animated:YES];
}];
RACTuplePack
把数据包装成RACTuple(元组类)
// 把参数中的数据包装成元组
RACTuple *tuple = RACTuplePack(@"Scott_Mr",@20);
RACTupleUnpack
把RACTuple(元组类)解包成对应的数据。
// 解包元组,会把元组的值,按顺序给参数里面的变量赋值
// name = @"Scott_Mr" age = @20
RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
NSLog(@"%@,%@",name,age);
声明
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan
ReactiveCocoa(二)的更多相关文章
- [iOS] 响应式编程开发-ReactiveCocoa(二)
RAC实现图片下载功能 在实现异步RAC下载图片的过程中,需要注意以下几点: • 通过 NSURLConnection 对象的 +(RACSignal *)rac_sendAsynchronousRe ...
- iOS开发之OC篇-响应式编程Reactive Cocoa
一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...
- ReactiveCocoa源码解读(二)
上一篇解读了ReactiveCocoa的三个重要的类的底层实现,本篇继续. 一.RACMulticastConnection 1.应用 RACMulticastConnection: 用于当一个信号被 ...
- ReactiveCocoa应用篇(二)
上一篇介绍了ReactiveCocoa的常用类,已经基本满足项目中的简单应用要求,但是针对复杂的功能还需要其它的类来协同处理.ReactiveCocoa提供了强大的流程处理功能来解决复杂的问题,包括事 ...
- RAC(ReactiveCocoa)使用方法(二)
RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用 ...
- iOS开发ReactiveCocoa学习笔记(二)
RAC 中常见的宏: 使用宏定义要单独导入 #import <RACEXTScope.h> 一. RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某 ...
- ReactiveCocoa源码拆分解析(二)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...
- ReactiveCocoa源码解析(二) Bag容器的代码实现
今天博客我接着上篇博客的内容来,上篇博客我们详细的看了ReactiveSwift中的Observer已经Event的代码实现.接下来我们来看一下ReactiveSwift中的结构体Bag的实现.Bag ...
- iOS开发之ReactiveCocoa下的MVVM(干货分享)
最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...
随机推荐
- Djano之写api使用django_rest_framework【海瑞博客】
使用django rest framework 可以更快速和友好的编写api,当然网上有很多教程,对于高手来说相对很简单,对于新手来说,根本搞不明白.那是你没有搞明白你自己的职责,做为后端,我们只要提 ...
- day06_03 购物车讲解01
1.0 思路 1.1 列表嵌套 # name1 = ['mac','book','bike','kindle'] a = [[1,2,3],'alex',(2,3,4)] print(a[0]) #& ...
- python 多版本的兼容
1.针对linux版本 linux版本的话,首先调用whereis python 来获取到多版本的路径. root@Ulord-14:~# whereis pythonpython: /usr/bin ...
- REMIX与LOCALHOST相连
REMIX与LOCALHOST相连 让Remix与本地文件系统进行交互,点击connect同时找到localhost下的Remix文件管理器的共享目录.在开始之前,参考网址: https://remi ...
- hadoop-搭建(转)--亲测好用 (一)
1)JDK软件 下载地址:http://www.oracle.com/technetwork/java/javase/index.html 2)Hadoop软件 下载地址:http://hadoop. ...
- Android通过onDraw实现在View中绘图操作
Android绘图操作,通过继承View实现,在onDraw函数中实现绘图. 下面是一个简单的例子: public class AndroidTest extends Activity { /** C ...
- 六、vue侦听属性
$watch 实际上无论是 $watch 方法还是 watch 选项,他们的实现都是基于 Watcher 的封装.首先我们来看一下 $watch 方法,它定义在 src/core/instance/s ...
- 基于eclipse+maven创建web工程
Eclipse+Maven创建webapp项目<一> 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显 ...
- 项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
Error: The import javax.servlet cannot be resolved The import javax.servlet.http.HttpServletRequest ...
- BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题
题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是 ...