今天来了解一下RAC
- Block简单使用
- RAC简介
- RACSignal类
- RACDisposable
- RACSubject
一、Block简单使用
- 有时候我们忘记了block的格式,这时,敲一个inlineBlock,就会出来
- block:ARC使用strong ,非ARC使用copy
1、block作为对象的属性
/******************* Person.h **********************************/ #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic,strong) void(^AMYBlock)(void); @end /******************* ViewController.m **********************************/ #import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic,strong)Person *p; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //1、Block作为对象的属性 Person *p = [[Person alloc]init]; void(^block)(void) = ^() { NSLog(@"block"); }; p.AMYBlock = block; _p=p; //_p直接拿成员变量 } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ self.p.AMYBlock();//self.p通过get方法拿 } - (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
2、block作为方法的参数
/****************** Person.h **********************/ #import <Foundation/Foundation.h> @interface Person : NSObject -(void)eat:(void(^)(NSString*))block; @end /****************** Person.m **********************/ #import "Person.h" @implementation Person -(void)eat:(void (^)(NSString *))block{ block(@"苹果"); } @end /***************** ViewController.m ***********************/ #import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic,strong)Person *p; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //Block作为方法的参数 Person *p = [[Person alloc]init]; [p eat:^(NSString *s) { NSLog(@"爱吃%@",s); }]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
3、block作为返回值(扩展非常强)
/**************** Person.h ***************************/ #import <Foundation/Foundation.h> @interface Person : NSObject -(void(^)(int))run; @end /***************** Person.m **************************/ #import "Person.h" @implementation Person -(void(^)(int))run{ return ^(int m){ NSLog(@"跑起来了!!%d",m); }; } @end /**************** ViewController.m ***************************/ #import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic,strong)Person *p; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //Block作为方法的参数 Person *p = [[Person alloc]init]; p.run(100); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
二、RAC简介
1、RAC是什么?
- RAC — ReactiveCocoa(RAC) Github 一个开源框架!!
- RAC — 函数响应式编程框架!!
2、RAC有什么用?
- 帮助我们更简单霸气的处理事件!!
3、RAC的引入
XXXXXXXXXXXXXXXXXXXXXXX
4、RAC里面最常见和常用的类
- RACSignal
- RACDisposable
- RACSubscriber
- RACSubject
三、RACSignal类(信号类!)
使用:
(1)通过RACSignal创建一个信号!! (默认是: 冷信号!!)
(2)通过订阅者!订阅这个信号!(变成: 热信号!!)
(3)发送信号!!
引入ReactiveObjC后: #import "ViewController.h" #import <ReactiveObjC/ReactiveObjC.h> @interface ViewController () @end
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //RACSignal:信号类,当我们有数据产生,创建一个信号!! //(1)通过RACSignal创建一个信号!! (默认是: 冷信号!!) //didSubscribe调用:只要这个信号被订阅就会调用 //didSubscribe作用:利用subscriber发送数据 RACSignal *signal =[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { //(3)发送信号!!,subscriber它来发送 [subscriber sendNext:@"呵呵哈哈嘿嘿"]; return nil; }]; //(2)通过订阅者!订阅这个信号!(变成: 热信号!!) //nextBlock调用:只要订阅者发送数据就会调用 //nextBlock作用:处理数据,展示UI界面! [signal subscribeNext:^(id _Nullable x) { //x:信号发送的内容!! NSLog(@"%@",x); }]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end