函数响应式编程

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
函数响应式编程(FRP Functional Reactive Programming)

函数响应式编程可以极大地简化项目,特别是处理嵌套回调的异步事件,复杂的列表过滤和变换,或者时间相关问题.

介绍

命令式编程:以命令为主,给机器提供一条又一条的命令序列让其原封不动的执行.
函数响应式编程(FRP):使用异步数据流进行编程.FRP的思想比较难理解,需要将以往的命令式编程思想转变为响应式编程思想.即面向数据流编程.

就像面向对象思想一样,把事物都看作Stream.变量.用户输入.属性.Cache.数据结构等等.这个开始可能会很难.

在命令式编程环境中,a:=b+c表示将表达式的结果赋给a,而之后改变b或c的值不会影响a.但在响应式编程中,a的值会随着b或c的更新而更新.

电子表格程序就是响应式编程的一个例子.单元格可以包含字面值或类似”=B1+C1”的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化.这很类似观察者模式(Gof).函数响应式编程的重点是流,Stream能接受一个,甚至多个Stream为输入.你可以merge两个Stream,也可以从一个Stream中filter出你感兴趣的Events以生成一个新的Stream,还可以把一个Stream中的Data values map到一个新的Stream中.

使用RAC

RAC就是一个第三方库,他可以大大简化你的代码过程。
官方的说,ReactiveCocoa(其简称为RAC)是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性。

注意 : 使用时需要引用头文件

//基本示例

#import <ReactiveCocoa/ReactiveCocoa.h>

//监听了textFild的UIControlEventEditingChanged事件,当事件发生时实现block
[[self.textFild rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x){
    NSLog(@"change");
}];
//文字更改监听
[[self.textFild rac_textSignal] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

//手势监听
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[[tap rac_gestureSignal] subscribeNext:^(id x) {
    NSLog(@"tap");
}];
[self.view addGestureRecognizer:tap];

//action监听
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

[[btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {
        NSLog(@"*****  响应RAC button的点击  *****");
    }];
示例代码

一.用户登录

textfield的 内容发生改变是的响应方法

1.已通过map函数将信号转换成新的信号
2.将多个信号联合起来
3.将联合起来的信号来给按钮的属性赋值

//获取 textfield  的内容改变信号 并且订阅
/*当textfield中的内容发生改变的时候回触发subscribeNext(订阅)block*/
[self.firstTextfield.rac_textSignal subscribeNext:^(id x) {
  NSLog(@"%@",x);
}];

//将 textfield 输入信号的 返回值进行修改  得到新的信号!
RACSignal *firstSignal = [self.firstTextfield.rac_textSignal map:^id(NSString *firstString) {
    NSInteger length = firstString.length;
    if (length >= 5 && length <= 10) {
        return @(YES);
    }
    return @(NO);
}];

 RACSignal *secondSignal = [self.secondTextfield.rac_textSignal map:^id(NSString *secondString) {
     if (secondString.length >5 && secondString.length < 10) {
         return @(YES);
     }
     return @(NO);
 }];

// 绑定用户名.密码判断结果的三个信号量,如果都为真,则按钮可用
RAC(self.loginButton,enabled) = [RACSignal combineLatest:@[firstSignal,secondSignal] reduce:^(NSNumber *firstRes,NSNumber *secondRes){
    return @(firstRes.boolValue && secondRes.boolValue);
}];

二. 观察者模式KVO

RAC中得KVO大部分都是宏定义,所以代码异常简洁,简单来说就是RACObserve(TARGET, KEYPATH)这种形式,TARGET是监听目标,KEYPATH是要观察的属性值,这里举一个很简单的例子,如果UIScrollView滚动则输出success。

1.KVO来监听property的变化,只要被观察属性改变,block就会被执行.
2.该property必须支持KVO
3.使用必须在注册之后


UIScrollView *scrolView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, 400)];
scrolView.contentSize = CGSizeMake(200, 800);
scrolView.backgroundColor = [UIColor greenColor];
[self.view addSubview:scrolView];
[RACObserve(scrolView, contentOffset) subscribeNext:^(id x) {
    NSLog(@"success");
}]

三. taget - action

//button
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(20, 400, 300, 40);
    btn.backgroundColor = [UIColor orangeColor];
    [self.view  addSubview:btn];
    [[btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {
        NSLog(@"*****  响应RAC button的点击  *****");
    }];

//手势
self.view.userInteractionEnabled = YES;
    UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]init];
    [[tap rac_gestureSignal] subscribeNext:^(UITapGestureRecognizer * tap) {
        NSLog(@"*****  响应单击手势  *****");
    }];
    [self.view addGestureRecognizer:tap];

四. 延时

[[RACScheduler mainThreadScheduler]afterDelay:2 schedule:^{
        NSLog(@"*****  first 延时rac写法  *****");
    }];

[[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]]subscribeNext:^(NSDate * date) {
        NSLog(@"***** second 延时rac写法  *****");
    }];

五. 通知

特别注意:RAC中的通知不需要remove observer,因为在rac_add方法中他已经写了remove。

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"postData" object:nil] subscribeNext:^(NSNotification *notification) {
   NSLog(@"%@", notification.name);
   NSLog(@"%@", notification.object);
}];

六. 将多个不同类型的数据组合成一个元组

 // 把参数中的数据包装成元组
    RACTuple *tuple = RACTuplePack(@"xmg",@20,@"m",@(999),@[@"a"],@{@"key":@"value"});

    RACTupleUnpack(NSString *name,NSNumber *age,NSString *sex,NSNumber *price,NSArray *arr,NSDictionary *dic) = tuple;
    NSLog(@"name:%@  age:%@  sex:%@  price:%@ arr:%@  dic:%@",name,age,sex,price,arr,dic);

七. 使用 #define RAC(TARGET, …)宏

//以下代码 可以将_label的text属性和后面的信号绑定信号内容发生改变的时候自动更新

RAC(_label,text) = self.textField.rac_textSignal;
响应式编程详解 响应式编程 (reactive programming) 是一种基于数据流 (data stream) 和 变化传递 ,以“非阻塞”和“异步”为特性,采用函数式的语法,实现并发执行效率。统一了java并发编程模型,使同步与异步的实现代码无明显差异。 阅读详情

相关推荐

函数响应式编程(FRP)思想

ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP。FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁,业务像流水一样清晰流畅。函数响应式编程响应式编程思想为体,函数式编程思想为用。

海洋顶端 7383

函数响应式编程(一)

函数相应式编程介绍: 函数式编程时一种编程范式,是面向数学的抽象,将计算描述为一种表达式求值,函数可以在任何地方定义,并且可以对函数进行整合。 响应式编程时一种面向数据流和变化传播的编程范式,数据更新是相关联的,把函数式编程里的一套思路和响应式编程合起来就是函数相应式编程函数相应式编程可以极大地简化项目,特别是处理嵌套回调的异步事件,复杂的列表过滤和变换或者时间相关问题。下面主要介绍函数...

xqy3177563的博客 591

iOS中的函数响应式编程思想

一、前言 最近正在学习iOS底层框架,在学习RxSwift的课程时,涉及到了函数响应式编程的思想,这让我想起了在工作项目中使用到的ReactiveCocoa第三方库,它里面也使用了函数响应式编程思想,之前只是看了简单的介绍,并会使用它而已,现在必须彻底去掌握该思想–函数响应式编程(FRP(Functional Reactive Programming)),下面就让我们一起揭开函数响应式编程思想的神秘面纱。 二、基本概念 在iOS开发中,有三种编程思想,分别是链式编程函数式编程响应式编程。 1、链式编程.

卓同学 541

那些年我们错过的响应式编程

相信你们在学习响应式编程这个新技术的时候都会充满了好奇,特别是它的一些变体,例如:Rx系列、Bacon.js、RAC等等…… 在缺乏优秀资料的前提下,响应式编程的学习过程将满是荆棘。起初,我试图寻找一些教程,却只找到少量的实践指南,而且它们讲的都非常浅显,从来没人接受围绕响应式编程建立一个完整知识体系的挑战。此外,官方文档通常也不能很好地帮助你理解某些函数,因为它们通常看起来很绕,不信请看这

liyong20080101的专栏 990

函数式响应式编程(FRP)基本了解

函数式响应式编程(FRP)基本了解 理念 我们在日常开发中大多使用的是命令式编程,这种模式依赖于我们希望自己的程序如何来完成这些任务:开发者编写很多的指令来修正程序的状态;如果开发者在正确的位置上编写了正确的指令,那么程序将会正确的完成任务。我们只需要告诉程序怎么做。 与此相反,声明式编程(Declarative Programming)将程序员们从纷繁复杂的对如何完成某些任务的细枝末节的流程中解放出来,将关注点集中在任务到底“是什么”而非实现任务的流程。声明式编程是命令式编程之外的几种编程范式的一个

Heyuan_Xie的博客 291

什么是函数响应式编程

什么是函数响应式编程响应式编程思想为体,函数式编程思想为用。首先我们要来了解什么是函数式编程响应式编程。 什么是函数式编程? 顾名思义,函数式编程就是用函数来解决问题的编程方式,几乎任何一门语言都支持函数,但是函数式编程具有几个特点: 声明式(Declarative) 纯函数(Pure Functio 数据不可变性(Immutability) 在深入了解这三个特点之前,我们需要知道Jav...

往前跑 1552

函数式编程 -> 函数响应式编程

现在大家已经了解我们是如何运用函数式编程来操作序列的。其实我们可以把这种操作序列的方式再升华一下。例如,你可以把一个按钮的点击事件看作是一个序列: // 假设用户在进入页面到离开页面期间,总共点击按钮 3 次 // 按钮点击序列 let taps: Array<Void> = [(), (), ()] // 每次点击后弹出提示框 taps.forEach { showAlert() } 这样处理点击事件是非常理想的,但是问题是这个序列里面的元素(点击事件)是异步产生的,传统序列是无法描叙

极客专栏 1613

ReactiveCocoa 函数响应式编程简介 链式编程 函数式编程 响应式编程

最近,RAC的名气可谓是越来越大,出于对技术的探索心(为了装逼),最近研究学习了一下RAC,以下是本人在学习中对其的一些粗浅的认识; 首先,什么是RAC,ReactiveCocoa时Github上的一个Cocoa FRP框架,目的为了接管苹果的所有事件机制(addTarget,代理,通知,KVO,时钟,网络处理);从其强大的作用就可以看出,这是一个超重量级大框架,慎用! RAC运用的是函数响应

zhaomengnan的博客 2097

函数式编程响应式编程

到底什么是函数式,他和命令式编程和面向对象有什么区别。(知乎上已经有很多讨论了,感兴趣的话,我在结尾的地方贴了一些链接。) 总的来说,在函数式中,函数是一等公民,函数能作为变量的值,函数可以是另一个函数的参数,函数可以返回另一个函数等等。 函数式编程 函数式编程是一系列被不公平对待的编程思想的保护伞,它的核心思想是,它是一种将程序看成是数学方法的求值、不会改变状态、不会产生副作用(后面我们...

u013362969的博客 1840

函数式编程响应式编程之己见

1. what is 函数式编程函数,在编程中,通常体现为: 输入 =&gt; 执行 =&gt; 结果。他不是命令式的,而是对一段操作进行逻辑封装,拿到输入,就能产出结果。通常来说,满足函数式编程的特性的“函数”应该有如下特点: 函数必须有入参,并且函数的产出会根据入参的不同而变化。 函数执行的整个流程中,不会对全局变量、外部属性等产生影响。 函数式编程代码量小,干净。 举个例子: ...

Tycho‘s Blog 3396

函数式编程响应式编程:现代开发中的范式转变

函数式编程(Functional Programming,简称 FP)是一种编程范式,强调通过函数的组合来解决问题,且函数不依赖于外部状态或可变数据。它的核心理念是使用纯函数和不可变性,通过函数输入来确定输出,不会产生副作用。例如,在函数式编程中,我们更加关注的是“我们要做什么”,而不是“我们如何做这种声明式的风格可以使代码更简洁、更易于理解和调试。// 传统的面向过程风格i++) {// 函数式编程响应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式。

byby0325_的博客 1248

链式编程函数式编程响应式编程

链式编程思想:是将多个操作通过点号(.)链接在一起成为一句代码,使代码可读性好。 链式编程的特点:方法的返回值是block,block必须有返回值(对象本身),block里可以有参数(需要操作的值)。方法的返回值必须是方法的调用者。 代表作: masonry框架

SHTLoveXX的专栏 726

Kotlin Flow响应式编程,操作符函数进阶

大家好,今天原创。在上一篇原创文章当中,我跟大家说了会开启一个新的系列,讲一讲Kotlin Flow响应式编程从入门到进阶的内容。总共计划是用三篇文章讲完,而本篇则是这个系列的第二篇文章。如果你还没有看过前面的基础知识入门的话,可以先去参考这里。本篇文章我打算着重讲解一下操作符函数的相关内容。什么是操作符函数?如果你熟悉RxJava,那么对于操作符函数一定不会陌生。

郭霖的专栏 4万+

RxSwift--函数响应式编程思想

文章目录1.函数式编程2.响应式编程3.函数响应式编程 1.函数式编程   FP(Functional Programming):简单来说,函数是变成是一种编程范式,它将电脑运算视为函数的计算,属于结构化编程的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。   相对于命令式编程是通过修改变量的值来保存当前程序的状态,函数式编程是通过函数来保存程序的状态的,或者说是通过函数创建新的参数或...

JeffersonZHabc的专栏 328

响应式编程函数式编程

一、响应式编程(Reactive Programming,RP) 1、关键字   关键字:RxJava,观察者模式,EventBus,广播,Gateway    2、定义   响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。   例如,对于 a=b+c 这个表达式的处理,在命令式编程中,会先计算 b+c 的结果,再把此结果赋值给变量a,因此b,c两值的变化不会对变量a产生影响。但在响应式编程中,变量a

qq_16268979的博客 1172

响应式java递归怎么写_响应式函数式编程

姓名:荣皓宇学号:17101223406转载自: http://www.jianshu.com/p/0c8a692a0c7f?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io【嵌牛导读】:多线程编程响应式函数式两种,比较容易混淆,本文给出其区分和各自特点【嵌牛鼻子】:多线程,函数式响应式【嵌牛提问】:这两种...

weixin_35625324的博客 278

浅谈函数式编程函数响应式编程

浅谈函数式编程函数响应式编程链接: https://segmentfault.com/a/1190000003632186 作者: Fakefish全文转载如下:大概几个月前,受题叶影响开始关注函数式编程,在看完一本 js 的函数式之后,对函数式有了点基本的了解。函数式给我的感觉,最大的一个主旨是是编程中所有过程可控,尤其在 js 这种没有原则的语言中,过程可控制有为重要。函数式 到底什么是函

Maxwell 1273
上一篇: GPUImage源码解读(二)
下一篇: GPUImage源码解读(三)
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值