ReactiveCocoa 响应式编程 RAC
Posted Hunter_Wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReactiveCocoa 响应式编程 RAC相关的知识,希望对你有一定的参考价值。
CocoaPoas 导入
// // TestView.m // ReactiveCocoaDemo // // Created by dllo on 16/4/1. // Copyright © 2016年 HaiTeng. All rights reserved. // #import "TestView.h" @implementation TestView - (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(10, 10, 280, 280); button.backgroundColor = [UIColor yellowColor]; [self addSubview:button]; [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; } return self; } - (void)buttonAction:(UIButton *)sender{ NSLog(@"点击按钮"); } @end
// // ViewController.m // ReactiveCocoaDemo // // Created by dllo on 16/4/1. // Copyright © 2016年 HaiTeng. All rights reserved. // #import "ViewController.h" #import "TestView.h" #import "AFNetWorking.h" #import "ReactiveCocoa.h" @interface ViewController () @property (nonatomic, assign) NSInteger count; @end @implementation ViewController /* *ReactiveCocoa 响应式编程 简称RAC 不考虑调用过程,直接关注事件结果 支持ios和OS 系统 也有说 RAC叫函数响应式编程 (FRP) *函数式编程 例如:Masonry */ - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor grayColor]; /* RACSignal RAC中的核心类 一般实现由数据变化时传递, 传递时会发送信号, 如果 "订阅信号", 此时会被接收. */ [self replaceDelegate]; [self replaceKVO]; } #pragma mark - RAC 实现代理 - (void)replaceDelegate { TestView *testView = [[TestView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; testView.backgroundColor = [UIColor blackColor]; [self.view addSubview:testView]; //只要testView调用了 buttonAction: 方法, 就会转变成一个信号 RACSignal *signal = [testView rac_signalForSelector:@selector(buttonAction:)]; //订阅信号 __weak ViewController *temp = self; [signal subscribeNext:^(id x) { NSLog(@"响应信号"); temp.count ++; }]; } #pragma mark - RAC KVO - (void)replaceKVO { /* *self 调用是因为 观察的对象是 当前类的属性. *第一个参数 观察的属性 不要拼错 */ //我监听我的count属性的变化 // RACSignal *signal = [self rac_valuesForKeyPath:@"count" observer:nil]; //(这个方法,新旧值都可取到) RACSignal *signal = [self rac_valuesAndChangesForKeyPath:@"count" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld observer:nil]; //订阅信号 (不管是用RAC返回的信号 或者自带的信号 还是自己创建的信号 发送信号时的参数 必须是一个对象) [signal subscribeNext:^(id x) { NSLog(@"%@",x); }]; } @end
此打印会看到
#pragma mark - 监听事件
- (void)observeEvent { //继承于UIControl的控件 都可以使用 rac_signalForControlEvents: 方法监听事件 [[_button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { NSLog(@"凡是control 控件 UIControlEventTouchUpInside 这种模式 都可以监听他们的事件"); }]; }
在ViewDidLoad 中调用此方法,看看.
#pragma mark - TextFiel相关
- (void)textFieldTextChange { // rac_textSignal 获取文本的改变信号 [_textFiled.rac_textSignal subscribeNext:^(id x) { NSLog(@"%@",x); }]; //文本字符串长度大于n开始响应 // [[_textFiled.rac_textSignal filter:^BOOL(NSString *value) { // // return value.length > 6; // }] subscribeNext:^(id x) { // NSLog(@"%@",x); // }];= // // //map 映射 // [[[_textFiled.rac_textSignal filter:^BOOL(NSString *value) { // return value.length > 6; // }] map:^id(NSString *value) { // return [NSString stringWithFormat:@"明天放假啦 %@",value]; // }] subscribeNext:^(id x) { // NSLog(@"??%@",x); // }]; // //throttle:<#(NSTimeInterval)#> 节流 . 延时响应(3秒内信号不改变时 响应) // [[[self.textFiled.rac_textSignal throttle:3] distinctUntilChanged] subscribeNext:^(id x) { // NSLog(@"%@",x); // }]; }
可在ViewDidLoad 中调用此方法,一一查看.
#pragma mark - 多个数据请求
-(void)multiplyRequest { RACSignal *firstSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //处理信号 [APPTools GETWithURL:@"http://c.3g.163.com/nc/ad/headline/0-4.html" par:nil success:^(id responseObject) { NSLog(@"第一个请求完成"); //发送信号 [subscriber sendNext:responseObject]; } filed:^(NSError *error) { }]; return nil; }]; RACSignal *secondSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //处理信号 [APPTools GETWithURL:@"http://c.3g.163.com/nc/article/headline/T1348647853363/0-140.html" par:nil success:^(id responseObject) { NSLog(@"第二个请求完成"); //发送信号 [subscriber sendNext:responseObject]; } filed:^(NSError *error) { }]; return nil; }]; //两个信号都发出内容时响应 [self rac_liftSelector:@selector(requestWithFirst:SecondDic:) withSignals:firstSignal,secondSignal, nil]; } - (void)requestWithFirst:(NSDictionary *)firstDic SecondDic:(NSDictionary *)senconDic { NSLog(@"都返回值了"); }
可在ViewDidLoad 中调用此方法,查看.
// 把对象的某个属性绑定一个信号, 当信号改变时, 就把信号的内容赋值给绑定的对象属性 RAC(_lable,text) = _textFiled.rac_textSignal;
以上是关于ReactiveCocoa 响应式编程 RAC的主要内容,如果未能解决你的问题,请参考以下文章