RAC的使用(持续更新)

文丨清枫

什么是RAC

ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾。ReactiveCocoa5.0以后将 RAC 拆分为四个库:ReactiveCocoa、ReactiveSwift、ReactiveObjC、ReactiveObjCBridge。其中的ReactiveCocoa和ReactiveObjC,一个适用于纯Swift项目,另一个适用于纯OC项目。

RAC的作用

  • 实现代理:rac_signalForSelector
  • 代替KVO :rac_valuesAndChangesForKeyPath
  • 监听事件:rac_signalForControlEvents
  • 实现通知:rac_addObserverForName
  • 监听文本框文字改变:rac_textSignal
  • 处理当界面有多次请求时,需要都获取到数据时,才能展示界面
    rac_liftSelector:withSignalsFromArray:Signals
  • 把要处理的事件和监听的事件放在一起,使代码高聚合,低耦合

函数式编程思想

函数式编程:就是尽可能的使用函数嵌套的方式来编程,函数式编程的目的就是尽可能的使代码高内聚,代表框架是ReactiveCocoa

函数式编程的方法签名要求:

  • 方法的返回值是对象本身
  • 方法的参数是Block
  • Block的参数是需要操作的值
  • Block的返回值是操作的结果

响应式编程思想:

响应式编程是一种面向数据流变化传播的编程范式。编程语言中可以很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

在响应式编程中万物皆是流。 任何事物都可以当作一个流:变量、用户输入、属性、缓存、数据结构等等。

集成ReactiveCocoa

纯Swift项目Cocoapods导入

podfile文件中的内容:

platform:ios, ‘8.0’
use_frameworks! 
target ‘这里写你的工程名’ do
pod 'ReactiveCocoa'              
end

纯OC项目Cocoapods导入

podfile文件中的内容:

platform:ios, ‘8.0’
use_frameworks! 
target ‘这里写你的工程名’ do
pod 'ReactiveObjC'              
end

Tips:若项目为Swift和OC混编,那么需要将ReactiveObjC和ReactiveCocoa都导入,同时需要手动导入ReactiveObjCBridge。

RAC的使用(代码持续更新)

#import "ViewController.h"
#import "ReactiveObjC.h"
#import "NSObject+RACKVOWrapper.h"

@interface ViewController ()

@property(strong, nonatomic) id<RACSubscriber> subscriber;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
    //RACSignal:只能订阅信号,在内部由订阅者发送信号
  //创建信号
  RACSignal *signal = [RACSignal createSignal:^RACDisposable * (id<RACSubscriber> subscriber) {//订阅信号,执行subscribeNext时调用该代码块
    //发送信号
    [subscriber sendNext:@"MrFung"];
    [subscriber sendCompleted];

    return [RACDisposable disposableWithBlock:^{
      NSLog(@"信号发送完成或者错误,执行此block取消订阅,当前信号不再被订阅");
    }];
  }];

  //订阅信号
  [signal subscribeNext:^(id x){//发送数据:调用sendNext时才会调用该代码块
    NSLog(@"接收数据:%@", x);//接收数据:MrFung
  }];
  
    //RACDisposable:取消订阅
  //创建信号
  RACSignal *signal = [RACSignal createSignal:^RACDisposable * (id<RACSubscriber> subscriber) {
    //发送信号
    [subscriber sendNext:@"MrFung"];

    _subscriber = subscriber;//全局变量保存起来,系统不会取消订阅
    return [RACDisposable disposableWithBlock:^ {
      NSLog(@"取消订阅,清理资源");
    }];
  }];

  //订阅信号
  RACDisposable *dispose = [signal subscribeNext:^(id x) {
    NSLog(@"接受数据: %@", x);
  }];

  [dispose dispose];//主动取消订阅
  
  //RACSubject:既能订阅信号,也能发送信号
  //创建信号
  RACSubject *subject = [RACSubject subject];

  //订阅信号
  [subject subscribeNext:^(id x) {
    NSLog(@"接收到值: %@", x);
  }];

  //发送信号
  [subject sendNext:@"MrFung"];
  
  //RACReplaySubject:既可以先订阅信号再发送信号,也可以先发送信号再订阅信号
  //先订阅再发送:
  //创建信号
  RACReplaySubject *replaySubject = [RACReplaySubject subject];

  //订阅信号
  [replaySubject subscribeNext:^(id x) {
    NSLog(@"订阅者1接收到值: %@", x);
  }];

  //发送信号
  [replaySubject sendNext:@"MrFung"];
  
  //先发送再订阅:
  //创建信号
  RACReplaySubject *replaySubject = [RACReplaySubject subject];

  //发送信号
  [replaySubject sendNext:@"MrFung"];

  //订阅信号
  [replaySubject subscribeNext:^(id x) {
    NSLog(@"订阅者1接收到值: %@", x);
  }];
  
  //RAC的KVO:
  [self.view rac_observeKeyPath:@"alpha" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
    NSLog(@"change: %@", change);
  }];

  [[self.view rac_valuesAndChangesForKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
    NSLog(@"x:%@", x);
  }];
  
  //RAC按钮监听事件
  UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 200, 30)];
  [button setTitle:@"Button" forState:UIControlStateNormal];
  button.backgroundColor = [UIColor grayColor];

  //监听和实现在一起
  [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^ (id x) {
    NSLog(@"按钮被点击了:%@", x);
  }];

  [self.view addSubview:button];
  
  //RAC通知:
  [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
    NSLog(@"键盘即将显示");
  }];

  //RAC监听文本框内容
  [[textField rac_textSignal] subscribeNext:^ (id x) {
    NSLog(@"文本框内容改变了: %@", x);
  }];
  
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  self.view.backgroundColor = [UIColor grayColor];
  self.view.alpha = 0.5;
}

@end

代码github地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,960评论 3 119
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 寒衣未褪尽,花事已荼蘼。 樱落离人眼,絮飘无所惜。 海棠高烛秉,桃李竹篱依。 同是春光遣,亲疏各自移。
    恒星TINA阅读 132评论 2 7
  • 面向对象编程特点(OOP):抽象:抓住核心问题封装:只能通过对象来访问方法继承:从已有的对象下继承出新的对象多态:...
    Searchen阅读 279评论 0 0
  • 一九七七年十二月入厂,先在铸管车间上班,做打压工一年多,后调冶炼大灶为厨师。一九八九年调离应朝去了润城供销社。 李...
    刘爱国阅读 413评论 0 0