[HMLY]11.iOS函数式编程的实现&&响应式编程概念

简介

本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助。

作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit;

    • Masonry是一个OC开发中,非常好用的自动布局的第三方框架;
    • SnapKit是Masonry团队打造的swift版本的自动布局框架;
      如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”!

一个典型的Masonry的语句:

make.centerY.equalTo(self.view).offset(100);

就是这个“.”让Masonry更加鲜活的展示给了开发者,在我心中
Masnory/ SnapKit函数式编程的一个经典的代表作,非常值得参考和学习!

链式编程的好处不用再说了,用过Masnory/ SnapKit的都知道;

那么问题来了,怎么写链式编程呢?

一步步来实现一个函数式编程

    1. 新建项目command +shift + N
    2. 创建一个Person类
      并为其增加两个方法
 - (void)run;
  - (void)study;

简单实现:
- (void)run{
   NSLog(@"run");
  }
  - (void)study {
   NSLog(@"study")
  }

3.实例化并调用相关的方法
 Person*person = [[Personalloc]init];
 [personrun];
 [personstudy];

以上三步实现了一个非常简单的程序;

最终目标
person.runBlock().studyBlock().runBlock();
    person.studyBlock().studyBlock().runBlock();
分解目标1.先实现这种方式调用
[[person run1] study1];

2.再实现最终目标显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。这样分析后,就简单了,就是增加一个返回值。

代码方法的声明
-(Person*)run1;
-(Person*)study1;

方法的实现
- (Person*)run1 {
        NSLog(@"run");
        return [[Personalloc] init];
}
- (Person*)study1{
         NSLog(@"study");
         return[[Personalloc]init];
}

实现最终目标:

    person.runBlock().studyBlock().runBlock();在OC中,block是以()的形式去执行的,猜想如果返回一个block的话,那么我就可以用()来实现runBlock()这种效果了吧!再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标!

代码:声明
- (Person* (^)())runBlock;
- (Person* (^)())studyBlock;
实现:
 - (Person* (^)())runBlock {
       Person* (^block)() = ^() {
                NSLog(@"run");
               return self;
        };
       return block;
}
 - (Person* (^)())studyBlock {
       Person* (^block)() = ^()  {
              NSLog(@"study");
              return self;
       };
        return block;
}再来看一下Masonry的一个函数式编程
make.right.equalTo(self.right).insets(kPadding);

最终调用的函数:返回的就是一个返回值为MASConstraint的block
- (MASConstraint* (^)(id))equalTo {
 return ^id(idattribute) {
      return self.equalToWithRelation(attribute,NSLayoutRelationEqual);
    };
}

函数式编程总结

  • 如果想再去调用别的方法,那么就需要返回一个对象;
  • 如果想用()去执行,那么需要返回一个block;
  • 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。

响应式编程的概念

在网上流传一个非常经典的解释`响应式编程的概念`
在程序开发中:
a = b + c
赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;

时间: 2024-11-06 10:03:34

[HMLY]11.iOS函数式编程的实现&&响应式编程概念的相关文章

深入浅出-iOS函数式编程的实现 && 响应式编程概念

简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 配图 作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit: Masonry是一个OC开发中,非常好用的自动布局的第三方框架: SnapKit是Masonry团队打造的swift版本的自动布局框架:如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点"赞

IOS开发之OC篇-响应式编程Reactive Cocoa

一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:https://github.com/ReactiveCocoa/ReactiveCocoa 二.相关概念 1> 响应式编程 举个栗子,在一般程序开发时  a = b + c , 赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化, 如果使用响应式编程,目标就是,如果 b 或者 c 的数值发生变化,

编程范式:响应式编程

响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中,a:=b+c表示将表达式的结果赋给a,而之后改变b或c的值不会影响a.但在响应式编程中,a的值会随着b或c的更新而更新. Event buses或者Click events本质上就是异步事件流(Asynchronous event stream),你可以监听并处理这些事件:任何一个东西我们都可以把他们当成一个str

使用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) 高阶函数:在函数式编程中,把函数当参数来回传递,而这个,说成术语,我

响应式编程(Reactive Programming)(Rx)介绍

很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它们都流于表面,从没有围绕响应式编程构建起一个完整的知识体系.库的文档往往也无法帮助你去了解它的函数.不信的话可以看一下这个: 通过合并元素的指针,将每一个可观察的元素序列放射到一个新的可观察的序列中,然后将多个可观察的序列中的一个转换成一个只从最近的可观察序列中产生值得可观察的序列. 天啊. 我看过

响应式编程总结

响应式编程关注的是变化及其传播. 响应式编程的着重点在于响应,即对变化做出的反应. 它的要素有四个: 1.数据拥有方: 2.数据使用方: 3.传播机制: 4.传播(处理)链条. 响应式编程的特征: 是数据拥有方向外部传播数据的变更,还是数据使用方接收到数据变化信号后从数据提供方获取数据: 数据的流通是通过set激发传播,还是get激发获取: 数据的提供方push,还是数据的使用方pull: 数据的使用方是被动等待数据,还是主动获取数据. 数据是通过函数的参数链传播,还是通过函数的返回值返回: 数

理解响应式编程

响应式的由来 我们先来聊一聊响应式的由来,对于它的由来,我们可能需要先从一段常见的代码片段看起 int a=1; int b=a+1; System.out.print("b="+b) // b=2 a=10; System.out.print("b="+b) // b=2 上面是一段很常见的代码,简单的赋值打印语句,但是这种代码有一个缺陷,那就是如果我们想表达的并不是一个赋值动作,而是b和a之间的关系,即无论a如何变化,b永远比a大1.那么可以想见,我们就需要花额

FRP-Functional Reactive Programming-函数响应式编程

响应式编程是一种面向数据流和变化传播的编程范式: 响应式编程和函数式编程的融合: 响应式编程为内核:函数式编程为工具: 流的概念先天适合函数式编程. Some quotes from the article: Reactive programming is programming with asynchronous data streams. On top of that, you are given an amazing toolbox of functions to combine, cre