美文网首页RAC
ReactiveCocoa--初识RAC

ReactiveCocoa--初识RAC

作者: Maple_Xu | 来源:发表于2017-04-27 18:18 被阅读25次

RAC是什么?
RAC — ReactiveCocoa(RAC) Github 一个开源框架!!
RAC — 函数响应试编程框架!!
RAC有什么用?
帮助我们更简单霸气的处理事件!!

RAC里面最常见和常用的类

  • RACSignal : 信号类!
    • 通过RACSignal创建一个信号!! (默认是: 冷信号!!)
    • 通过订阅者!订阅这个信号!(变成: 热信号!!)
    • 发送信号!!
  • RACDisposable:它可以帮助我们取消订阅.信号发送完毕了 ,失败了
  • RACSubscriber(协议):订阅者(发送信号!)
  • RACSubject :信号提供者!!,自己可以充当信号,又能够发送信号!!

下面通过一段简单的代码,了解一下RACSignal

    //RACSignal: 信号类,当我们有数据产生,创建一个信号!
    //1.创建信号(冷信号!)
    //didSubscribe调用:只要一个信号被订阅就会调用!!
    //didSubscribe作用:利用subscriber发送数据!!
    RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //3.发送数据subscriber它来发送
        [subscriber sendNext:@"呵呵哈哈嘿嘿"];
        
        return nil;
    }];
    
    
    //2.订阅信号(热信号!!)
    //nextBlock调用:只要订阅者发送数据就会调用!
    //nextBlock作用:处理数据,展示UI界面!
    [signal subscribeNext:^(id x) {
        //x:信号发送的内容!!
        NSLog(@"%@",x);
    }];

接下来我们再来看看 RACDisposable,它既然是帮助我们取消订阅的,那么我们一般在信号发送完毕了 或者失败了,都需要取消订阅。
默认一个信号发送数据完毕就会主动取消订阅,只要订阅者在,就不会自动取消订阅。有些时候我们不想信号发送完毕后就取消订阅,我们可以用一个强引用的属性来记录这个订阅者,当这个订阅者被强引用以后,就不会自动取消订阅了,我就需要手动取消订阅。示例代码如下

#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>

@interface ViewController ()
/**   */
@property(nonatomic,strong)id<RACSubscriber> subscriber;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.创建信号(冷信号!)
    RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //3.发送数据subscriber它来发送
        [subscriber sendNext:@"呵呵哈哈嘿嘿"];
        _subscriber = subscriber;
        return [RACDisposable disposableWithBlock:^{
            //只要信号取消订阅就会来这里
            //清空资源!!
            NSLog(@"哥么来了!!");
        }];
    }];
    
    
    //2.订阅信号(热信号!!)
   RACDisposable * disposable =  [signal subscribeNext:^(id x) {
        //x:信号发送的内容!!
        NSLog(@"%@",x);
    }];
    
    //默认一个信号发送数据完毕就会主动取消订阅
    //只要订阅者在,就不会自动取消订阅
    //手动取消订阅
    [disposable dispose];
}

@end

接下来我们再来看看 RACSubject :信号提供者
它自己可以创建信号,又能够发送信号。

    //1.创建信号
    RACSubject * subject = [RACSubject subject];
    
    //2.订阅信号
    //不同的信号订阅的方式不一样!!(因为类型不一样,所以调用的方法不一样)
    //RACSubject处理订阅:拿到之前的_subscribers保存订阅者
    [subject subscribeNext:^(id x) {
        NSLog(@"接受到了数据:%@",x);
    }];
    

    //3.发送数据
    //遍历出所有的订阅者,调用nextBlock
    [subject sendNext:@"汉堡包"];

接下来我们来看一个 RACSubjec简单的实际使用
现在我们的ViewController里有一个我们自定义的View叫WFView,里面有一个按钮,当我们点击这个按钮时 要通知我们的控制器干事情!

在我们的 WFView.h

#import <UIKit/UIKit.h>
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface HKView : UIView
@property(nonatomic,strong)RACSubject * btnClickSingnal;
@end

WFView.m

#import "WFView.h"
@implementation WFView

-(RACSubject *)btnClickSingnal {
    if (!_btnClickSingnal) {
        _btnClickSingnal = [RACSubject subject];
    }
    return _btnClickSingnal;
}

-(IBAction)btnClick:(id)sender {
    //通知外面!!
    [self.btnClickSingnal sendNext:self.backgroundColor];
}
@end

在我们的控制器中 订阅信号

    //订阅信号
    [self.HKView.btnClickSingnal subscribeNext:^(id x) {
        self.view.backgroundColor = x;
    }];

是不是很清爽呢?

相关文章

  • ReactiveCocoa--初识RAC

    RAC是什么?RAC — ReactiveCocoa(RAC) Github 一个开源框架!!RAC — 函数响...

  • RAC初识

    RAC: ReactiveCocoa 主要是由以下四大核心组件: RACStream :信号源 RAC...

  • 初识RAC

    RAC - ReactiveCocoa, 是github上的一套开源框架, 是一套函数响应式编程框架. 那么这套框...

  • RAC初识

    简介 简单的说,RAC就是一个第三方库,他可以大大简化你的代码过程。 官方的说,ReactiveCocoa(其简称...

  • 初识 RAC

    一.RAC 是什么?能做什么? 1.RAC是Reactive Cocoa的简称,是一种支持函数式响应式编程的框架,...

  • ReactiveCocoa 相关理论和实践

    RAC 初识https://gold.xitu.io/post/5829f4c3570c350063c436ach...

  • 初识RACSignal、RACDisposable及RACSig

    RAC是什么? RAC — ReactiveCocoa(RAC) Github 一个开源框架!! RAC — 函数...

  • 学习RAC小记-适合给新手看的RAC用法总结

    RAC是什么? RAC — ReactiveCocoa(RAC) Github 一个开源框架!! RAC — 函数...

  • RAC-ReactiveCocoa总结(一)

    RAC是什么? RAC — ReactiveCocoa(RAC) Github 一个开源框架!! RAC具有函数...

  • Oracle RAC与DG

    RAC RAC: real application clustersrac RAC: real applicati...

网友评论

    本文标题:ReactiveCocoa--初识RAC

    本文链接:https://www.haomeiwen.com/subject/vwhnzttx.html