iOS-Reactive Cocoa的常见用法
今天是周末,临近年底,工作上遇到不可抗力,会有点一些变动!这多少会让人有一点静不下来,但需克制,Reactive Cocoa是今天的主角!
废话不多说,今天聊聊Reactive Cocoa的常见使用!
Reactive Cocoa 是一个非常重量级一个框架,个人非常欣赏这个团队!!
为什么说Reactive Cocoa非常的牛!!
我们所熟知的iOS 开发中的事件包括:
- Target
- Delegate
- KVO
- 通知
- 时钟
- 网络异步回调
而 ReactiveCocoa ,就是用 信号 接管了 iOS 中的所有事件;也就意味着,用一种统一的方式来处理iOS中的所有事件,解决了各种分散的事件处理方式,显然这么一个庞大的框架学习起来也会比较难!而且如果习惯了iOS原生的编程,可能会觉得不习惯!
先看一个图:
从这张图中,可以看出利用 信号,ReactiveCocoa接管 iOS 的所有事件,抛给开发者对事件作出三个相应反应;
可以用一张图来简要说明
RAC 的特点
- 通过 block 函数式 + 链式 的编程,可以让所有相关的代码继承
在一起! - 使用时需要注意循环引用,@weakify(self) / @strongify(self) 组合解除循环引用;
下面用iOS开发中常见的五种事件来说明ReactiveCocoa的常见用法!
下载框架:
- 新建项目
- 进入终端,建立 Podfile,并且输入以下内容
- # Uncomment this line to define a global platform for your project
platform :ios, ‘8.0’- # Uncomment this line if you’re using Swift
use_frameworks!
pod ‘ReactiveCocoa’, ‘~> 4.0.4-alpha-4’
- 版本说明:
2.5 纯 OC
3.0 正式版支持 Swift 1.2
4.0 测试版支持 Swift 2.0
在终端输入以下命令安装框架
$ pod install
KVO 监听
程序实现: 监控Person name的属性变化;在touchesBegan中改变name的值,并将变化体现在UILabel上,实现KVO的监控功能;
* 注意,RAC 的信号一旦注册不会主动释放
* 只要在 block 中包含有 self. 一定会出现强引用
* 需要使用 @weakify(self) / @strongify(self) 组合使用解除强引用
Person类:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end
// ViewController.m
#import "ViewController.h"
@import ReactiveCocoa;
#import "Person.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (nonatomic, strong) Person *person;
@end
@implementation ViewController
- (Person *)person {
if (!_person) {
_person = [[Person alloc] init];
}
return _person;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self demoKvo];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.person.name = [NSString stringWithFormat:@"zhang %d",arc4random_uniform(100)];
}
- (void)demoKvo {
@weakify(self)
[RACObserve(self.person, name)
subscribeNext:^(id x) {
@strongify(self)
self.nameLabel.text = x;
}];
}
@end
文本框输入事件监听
#pragma -mark 文本框输入事件监听
/**
* 为了测试此函数,增加了一个nameText;监听文本框的输入内容,并设置为self.person.name
*/
- (void)demoTextField {
@weakify(self);
//创建一个冷信号 使用subscribeNext订阅一个信号
[[self.nameText rac_textSignal]
subscribeNext:^(id x) {
@strongify(self);
NSLog(@"%@",x);
self.person.name = x;
}];
}
文本框组合信号
#pragma -mark 文本信号组合
/**
* 为了验证此函数,增加了一个passwordText和一个Button,监测nameText和passwordText
* 根据状态是否enabled
*/
- (void)textFileCombination {
id signals = @[[self.nameText rac_textSignal],[self.passWordText rac_textSignal]];
@weakify(self);
[[RACSignal
combineLatest:signals]
subscribeNext:^(RACTuple *x) {
@strongify(self);
NSString *name = [x first];
NSString *password = [x second];
if (name.length > 0 && password.length > 0) {
self.loginButton.enabled = YES;
self.person.name = name;
self.person.password = password;
} else {
self.loginButton.enabled = NO;
}
}];
}
按钮监听
#pragma -mark 按钮监听
/**
* 验证此函数:当loginButton可以点击时,点击button输出person的属性,实现监控的效果
*/
- (void)buttonDemo {
@weakify(self);
[[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside]
subscribeNext:^(id x) {
@strongify(self);
NSLog(@"person.name: %@ person.password: %@",self.person.name,self.person.password);
}
];
}
代理方法
#pragma -mark 代理方法
/**
* 5、验证此函:nameText的输入字符时,输入回撤或者点击键盘的回车键使passWordText变为第一响应者(即输入光标移动到passWordText处)
*/
- (void)delegateDemo {
@weakify(self)
// 1. 定义代理
self.proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UITextFieldDelegate)];
// 2. 代理去注册文本框的监听方法
[[self.proxy rac_signalForSelector:@selector(textFieldShouldReturn:)]
subscribeNext:^(id x) {
@strongify(self)
if (self.nameText.hasText) {
[self.passWordText becomeFirstResponder];
}
}];
self.nameText.delegate = (id<UITextFieldDelegate>)self.proxy;
}
通知
#pragma -mark 通知
/**
* 验证此函数:点击textFile时,系统键盘会发送通知,打印出通知的内容
*/
- (void)notificationDemo {
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillChangeFrameNotification object:nil]
subscribeNext:^(id x) {
NSLog(@"notificationDemo : %@", x);
}
];
}
看来看看这张图,会不会清晰很多?
这么一个强大的RAC,赶紧来试试吧!
以上源码在gitHub:Demo链接
参考资料
iOS-Reactive Cocoa的常见用法的更多相关文章
- [HMLY]9.深入浅出-iOS Reactive Cocoa的常见用法
简介 今天的主角是Reactive Cocoa,聊聊Reactive Cocoa的常见使用:KVO.Target.Delegate.Notification. Reactive Cocoa 是一个重量 ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发之OC篇-响应式编程Reactive Cocoa
一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...
- iOS开发多线程篇 08 —GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- RAC(Reactive Cocoa)常见的类
导入ReactiveCocoa框架 在终端,进入Reactive Cocoa文件下 创建podfile 打开该文件 并配置 use_frameworks! pod 'ReactiveCocoa', ' ...
- Linux中find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
随机推荐
- 总结hashMap和hashtable
在这里帮大家总结一下hashMap和hashtable方面的知识点吧: 1. 关于HashMap的一些说法: a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.Ha ...
- ABAP基础4:模块化
子程序定义 以form开始,以endform结束,用perform语句调用,from语句可以在程序内部/外部,perform一定要写在前面 perform. from. 子程序模块 endform. ...
- import * as x from 'xx' 和 import x from 'xx'
普通xx.js文件 //不可变的依赖模拟数据 module.exports=[ { id: "d52dccfc-656d-11e8-b153-7cd30ad3aa7a", regi ...
- jquery.min.js v1.10.3版本autocomplete方法会在text前添加搜索出多少项的文本信息 要去除
http://stackoverflow.com/questions/13011127/how-to-remove-change-jquery-ui-autocomplete-helper-text ...
- Chipmunk-js物理引擎学习笔记
一.基本概念## 空间:在Chipmunk中,空间是所有对象容器.因此,刚体.形状.链接节点等对象都需要添加到空间中.空间控制这些对象的相互作用. 刚体:物理上的刚体指的是在运动和受力作用后,形状和大 ...
- 201771010128王玉兰《面象对象程序设计(Java)》第七周学习总结
第一部分:基础知识总结: 1继承 A:用已有类来构建新类的一种机制,当定义了一个新类继承一个类时,这个新类就继承了这个类的方法和域以适应新的情况: B:特点:具有层次结构.子类继承父类的方法和域: C ...
- Shift - And字符串快速处理 hdu5972+cf
基础知识介绍 KMP就是不断往前找1的位置,而ShiftAnd经过三步处理已经完成这个迭代的过程了 如果匹配两个字符集有限的字符串的话,那么Shift-And比kmp要快,找区间内某字符串出现的数目也 ...
- xshell行号显示
xshell显示行号: 输入命令: vim ~/.vimrc 输入: set nu 之后在打开文件 就可以 看到行号显示.
- Linux,Mac下MySQL的安装及一些知识点的整理
Linux下载安装 在服务器上下载的话,需要安装Mysql5.7相关的yum源 wget https://dev.mysql.com/get/mysql80-community-release-el7 ...
- 中国电信中兴F412光猫——IPTV与网络单线复用
标题: 中国电信中兴F412光猫--IPTV与网络单线复用 作者: 梦幻之心星 347369787@QQ.com 标签: [光猫, IPTV] 目录: 路由器 日期: 2019-2-30 目录 第一步 ...