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;



时间: 2024-07-31 04:37:27

ReactiveCocoa 响应式编程 RAC的相关文章

IOS响应式编程框架ReactiveCocoa(RAC)使用示例

ReactiveCocoa是响应式编程(FRP)在IOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几篇文章,感觉理论讲了很多,但是代码还是看不太懂,于是自己把它github文档上的一些使用的经典示例实现了一下,项目中有需要时可以直接搬过去用,用的熟练了再读源码也比较容易理解. 例1. 监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情. 这种情况其实就是IOS KVO机制使用的场景,使用

IOS响应式编程框架ReactiveCocoa(RAC)使用示例-备

ReactiveCocoa是响应式编程(FRP)在IOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几篇文章,感觉理论讲了很多,但是代码还是看不太懂,于是自己把它github文档上的一些使用的经典示例实现了一下,项目中有需要时可以直接搬过去用,用的熟练了再读源码也比较容易理解. 例1. 监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情. 这种情况其实就是IOS KVO机制使用的场景,使用

RAC响应式编程

RAC响应式编程开源地址:https://github.com/ReactiveCocoa/ReactiveCocoa# 作者 cbsfly_iDev 2016.01.04 21:06* 写了13984字,被134人关注,获得了134个喜欢 学习RAC小记-适合给新手看的RAC用法总结 字数1855 阅读4287 评论4 喜欢33 最近叶大直播写代码,我也做点小笔记. 什么是RAC? 几乎每一篇介绍RAC的文章开头都是这么一个问题.我这篇文章是写给新手(包括我自己)看的,所以这个问题更是无法忽视

ReactiveCocoa -函数式编程和响应式编程

RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现. ReactiveCocoa试图解决什么问题 ReactiveCocoa试图解决以下3个问题: 传统iOS开发过程中,状态以及状态之间依赖过多的问题 传统MVC架构的问题:Controller比较复杂,可测试性差 提供统一的消息传递机制 统一消息传递机制 iOS开发中,每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过

使用ReactiveCocoa实现iOS平台响应式编程

使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Programming,响应式编程),在维基百科中有这样一个例子介绍: 在命令式编程环境中,a = b + c 表示将表达式的结果赋给a,而之后改变b或c的值不会影响a.但在响应式编程中,a的值会随着b或c的更新而更新. Excel就是响应式编程的一个例子.单元格可以包含字面值或类似"=B1+C1″的公式,

高大上函数响应式编程框架ReactiveCocoa学习笔记1 简介

原创文章,转载请声明出处哈. ReactiveCocoa函数响应式编程 一.简介 ReactiveCocoa(其简称为RAC)是函数响应式编程框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现. 函数式编程 (Functional Programming) 函数式编程也可以写N篇,它是完全不同于OO的编程模式,这里主要讲一下这个框架使用到的函数式思想. 1) 高阶函数:在函数式编程中,把函数当参数来回传递,而这个,说成术语,我

响应式编程框架ReactiveCocoa学习——框架概览

这篇博客将会继续翻译RAC的官方文档Framework Overview. 主要是对RAC这和框架进行概览的介绍和学习.同时也可以参考我前面的两篇翻译<响应式编程框架ReactiveCocoa学习--基本操作符><响应式编程框架ReactiveCocoa介绍与入门>.其中ReactiveCocoa的Github官方地址为 https://github.com/ReactiveCocoa/ReactiveCocoa . 这篇文档包括了RAC中的对不同组件的高层描述,并解释如何进行结合

ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一! 简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模式的完美搭档,更多关于MVVM与ReactiveCocoa的讨论,参考这篇文章: [长篇高能]ReactiveCocoa 和 MVVM 入门 注意: ReactiveCocoa 最新3.0版本,使用Swift重写,

[译] Swift 的响应式编程

原文  https://github.com/bboyfeiyu/iOS-tech-frontier/blob/master/issue-3/Swift的响应式编程.md 原文链接 : Reactive Swift 原文作者 : Agnes Vasarhelyi 译文出自 : 开发技术前线 www.devtf.cn 译者 :Mr.Simple 校对者:Lollypo 状态 : 完成 让我们首先回到Apple刚推出Objective-C的继任者-Swift的时候,那真是一个非比寻常的时刻. Sir