简介

今天的主角是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. Qlik Sense Desktop

    2014年新一代的报表利器 Qlik Sense Desktop 初步体验 2014-09-22 12:45 by BIWORK, 974 阅读, 7 评论, 收藏, 编辑 Qlik Sense De ...

  2. Newtonsoft.Json 将C#对象转化为json格式

    object To json public static string ObjectToJson(object obj) { JsonSerializerSettings jss = new Json ...

  3. 读书笔记—CLR via C#委托和attribute

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

  4. 第三方控件netadvantage UltraWebGrid如何生成带加号多级表数据也就是带子表

    1.看代码不解释: ds.Relations.Add("fk", ds.Tables[0].Columns["Id"], ds.Tables[1].Column ...

  5. POCO Controller

    ---恢复内容开始--- POCO Controller 你这么厉害,ASP.NET vNext 知道吗?   写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 PO ...

  6. ASP.NET Identity登录原理 - Claims-based认证和OWIN

    MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN 在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣 ...

  7. iOS基础 - iOS程序启动原理

    一.UIApplicationMain 在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点 int UIApplicationMain(int ar ...

  8. facebook .net sdk 应用

    浅谈 facebook .net sdk 应用   今天看了一篇非常好的文章,就放在这里与大家分享一下,顺便也给自己留一份.这段时间一直在学习MVC,另外如果大家有什么好的建议或者学习的地方,也请告知 ...

  9. Router

    backbone库学习-Router backbone库的结构http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文的例子来 ...

  10. CSS居中方法搜集

    转自这里:http://jinlong.github.io/blog/2013/08/13/centering-all-the-directions/ 兼容低版本IE的方法 html使用表格结构 背景 ...