博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ReactiveCocoa 响应式编程 RAC
阅读量:4484 次
发布时间:2019-06-08

本文共 4968 字,大约阅读时间需要 16 分钟。

 

哈哈哈哈? ------------- 大哥原创

请多多指教 .....................................................


 

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
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
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;

 

 

 

 


 

转载于:https://www.cnblogs.com/HaiTeng/p/5345447.html

你可能感兴趣的文章
如何通过Java启动linux脚本
查看>>
linux系统调用之网络管理2
查看>>
三种样式表插入方法
查看>>
hdu 2139 Calculate the formula (递推)
查看>>
mac, ios 模拟器
查看>>
双向宽度优先搜索
查看>>
常见的异常处理
查看>>
Linux基本命令参数
查看>>
Django系列(一)
查看>>
【ASP.NET Web API教程】2.3.3 创建Admin控制器
查看>>
第二类斯特林数
查看>>
Mysql
查看>>
JQuery中简约的进度条插件推荐
查看>>
url override and HttpSession implements session for form
查看>>
servlet乱码问题
查看>>
反射+特性实现 类和XML文档的序列化反序列化
查看>>
日常方法
查看>>
用于后台管理基于iview,vue的穿梭框
查看>>
关于HashMap
查看>>
RuntimeException、Exception和error的区别
查看>>