简介

今天的主角是Reactive Cocoa,聊聊Reactive Cocoa的常见使用:KVO、Target、Delegate、Notification。

Reactive Cocoa 是一个重量级框架,非常的牛,为什么说Reactive Cocoa非常的牛?
我们所熟知的iOS 开发中的事件包括:

  • Target
  • Delegate
  • KVO
  • 通知
  • 时钟
  • 网络异步回调

ReactiveCocoa ,就是用信号接管了iOS 中的所有事件;也就意味着,用一种统一的方式来处理iOS中的所有事件,解决了各种分散的事件处理方式,显然这么一个庞大的框架学习起来也会比较难!而且如果习惯了iOS原生的编程,可能会觉得不习惯!

先看一个图:

从这张图中,可以看出利用信号,ReactiveCocoa接管iOS 的所有事件,抛给开发者对事件作出三个相应反应;

可以用一张图来简要说明

RAC 的特点

  • 通过 block 函数式 + 链式 的编程,可以让所有相关的代码继承在一起!
    函数式 && 链式?
  • 使用时需要注意循环引用,@weakify(self) / @strongify(self) 组合解除循环引用;?

下面用iOS开发中常见的五种事件来说明ReactiveCocoa的常见用法!

下载框架:

  • 新建iOS工程
  • 进入终端,建立 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.h

#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;
}//实现person的懒加载
- (void)viewDidLoad
{
[super viewDidLoad];
[self demoKvo];
}// 在viewDidLoad中调用demoKvo方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.person.name = [NSString stringWithFormat:@"zhang %d",arc4random_uniform(100)];
}//在touchesBegan方法中改变person的name属性。

 

/**
* 1、为了测试此函数,增加了一个Person类 && 一个Label;点击屏幕则会等改Lable的值
*/
#pragma -mark KVO 监听

-(void)demoKvo{
  @weakify(self)
  [RACObser(self.person,name)
  subscribeNext:^(id x){
  @strongify(self)
  self.nameLabel.text = x ;
  }
  ];
}
@end

文本框输入事件监听

#pragma -mark 文本框输入事件监听
/**
* 2、为了测试此函数,增加了一个nameText;监听文本框的输入内容,并设置为self.person.name
*/
-(void)demoTextField{
@weakify(self);
[[self.nameText rac_textSignal]
 subscribeNext:^(id x){
  @stongify(self);
  NSLog(@"%@",x);
  self.person.name = x ;
  }
  ];
}

文本框组合信号

#pragma -mark 文本信号组合
/**
* 3、为了验证此函数,增加了一个passwordText和一个Button,监测nameText和passwordText
* 根据状态是否enabled
*/
-(void)textFileCobination{
id signals = @[[self.nameText rac_textSigal],[self.passWordText rac_textSignal]];//包装两个信号数组
@weakify(self);
[[RACSignal
  combineLatest:signals]//组合最新的信号
  subscribeNext:^(RACTuple *x){//响应者 参数数组
  
  @strongify(self);
  NSString *name = [x first];  //将数组第一个赋值给name
  NSString *password = [x second];  //将数组第二个赋值给password
  
  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 按钮监听

/**
* 4、验证此函数:当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);
}
];
}


 

[HMLY]9.深入浅出-iOS Reactive Cocoa的常见用法的更多相关文章

  1. iOS-Reactive Cocoa的常见用法

    今天是周末,临近年底,工作上遇到不可抗力,会有点一些变动!这多少会让人有一点静不下来,但需克制,Reactive Cocoa是今天的主角! 废话不多说,今天聊聊Reactive Cocoa的常见使用! ...

  2. iOS开发之OC篇-响应式编程Reactive Cocoa

    一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...

  3. RAC(Reactive Cocoa)常见的类

    导入ReactiveCocoa框架 在终端,进入Reactive Cocoa文件下 创建podfile 打开该文件 并配置 use_frameworks! pod 'ReactiveCocoa', ' ...

  4. 深入浅出--iOS的TCP/IP协议族剖析&&Socket

    深入浅出--iOS的TCP/IP协议族剖析&&Socket   简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久! ...

  5. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  6. iOS开发UI篇—常见的项目文件介绍

    iOS开发UI篇—常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...

  7. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  8. (转)深入浅出 iOS 之生命周期

    原文:http://www.cocoachina.com/applenews/devnews/2011/0817/3129.html 深入浅出 iOS 之生命周期 发布于:2011-08-17 10: ...

  9. 【转】深入浅出 iOS 之生命周期

    [iOS]深入浅出 iOS 之生命周期 深入浅出 iOS 之生命周期  http://blog.csdn.net/kesalin/article/details/6691766 罗朝辉(http:// ...

随机推荐

  1. ProvissyTool Update Support Page

    DO NOT REPLY. ############# #??????# ############

  2. Just a complaint about the college examinations

    Well , you know. As a college student who want to find a good job after graduating  like me , scores ...

  3. Byte[]、Image、Bitmap 之间的相互转换

    原文:Byte[].Image.Bitmap 之间的相互转换 /// <summary>        /// 将图片Image转换成Byte[]        /// </summ ...

  4. 读书笔记—CLR via C#章节8-10

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  5. Nhibernate分页测试续

    Nhibernate分页测试续(附源码) 接着上一篇Nhibernate分页测试,最近一直在接触Nhibernate,接触的越多.了解越深,越是感觉他的强大,很多功能都封装的很好,对数据操作是那么的简 ...

  6. Linux内核策略介绍

      Linux内核策略介绍学习笔记   主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...

  7. 学习selenium python版最初的一个小想法

    这个还是我在刚开始学习selenium的时候做的,自己觉得有点意思,在接下来我会基于目前我对于selenium的一些深入研究,写下我对selenium的理解以及UIAutomation的一些理解,以此 ...

  8. 玩转python之每次处理一个字符

    在Python中字符就是长度为1的字符串,所以可以循环遍历一个字符串,依次访问每一个字符,得到你想要的处理前提: 一个列表是个好主意,就像这样:thelist = list(thestring) 当然 ...

  9. 传说中的华为Python笔试题——两等长整数序列互换元素,序列和的差值最小(修正)

    有两个序列a,b,大小都为n,序列元素的值任意整形数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小. 1. 将两序列合并为一个序列,并排序,得到source ...

  10. linux下sshd_config的StrictModes参数

    今天在两台机器A和B上设置免密码登录,A机是Centos6.5,B机是Centos7,我想通过A机免密码登录到B机,在两台机器上设置好公钥和私钥后,在A机上通过ssh连接B机,每次都是要让我手动输入密 ...