RAC的实现原理

RAC是什么?

RAC — ReactiveCocoa(RAC)  Github 一个开源框架!!

RAC — 函数响应编程框架!!

RAC有什么用?

帮助我们更简单霸气的处理事件!!


RAC里面最常见和常用的类!!!(注意先pod 'ReactiveCocoa','4.0.0'

·RACSignal : 信号类!

  1. 通过RACSignal创建一个信号!! (默认是: 冷信号!!)
  2. 通过订阅者!订阅这个信号!(变成: 热信号!!)
  3. 发送信号!!

RACDisposable:它可以帮助我们取消订阅.信号发送完毕了 ,失败了.

RACSubscriber(协议):订阅者(发送信号!)

RACSubject :信号提供者!!,自己可以充当信号,又能够发送信号!!


RACSignal(信号类)的应用

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

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    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];
    
}


RACSubscriber(协议):订阅者(发送信号!)

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

@interface ViewController ()

@end

@implementation ViewController

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

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

原理图:





RAC的简单应用(功能 类似block和代理反向传值和传事件
HKView.h
#import <UIKit/UIKit.h>
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface HKView : UIView
/**   */
@property(nonatomic,strong)RACSubject * btnClickSingnal;
@end
HKView.m
#import "HKView.h"

@implementation HKView

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


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


@end
ViewController.m
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
#import "HKView.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet HKView *HKView;

@end

@implementation ViewController

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

























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值