作为一个iOS developer,那么你一定用过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 = [[Person
alloc]
init];
    [person
run];
    [person
study];

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

我们的最终目标
   
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 [[Person
alloc]
init];
       }
      -(Person
*)study1{
         
NSLog(@"study");
         
return
[[Person
alloc]
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(id
attribute) {

       
return
self.equalToWithRelation(attribute,
NSLayoutRelationEqual);

    };
}

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


响应式编程的概念

     在网上流传一个非常经典的解释`响应式编程的概念`
     在一般的程序开发中:
     a = b + c
     赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
    响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;
   
在上篇博客中《iOS-Reactive Cocoa的常见用法》http://blog.csdn.net/yang198907/article/details/50612652
Reactive Cocoa就是一个响应式编程的经典作品!


iOS-函数式编程 && 响应式编程概念的更多相关文章

  1. 函数式编程--响应式编程 ---android应用例子

    RxJava implements this operator as create. It is good practice to check the observer’s isUnsubscribe ...

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

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

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

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

  4. 函数式响应式编程 - Functional Reactive Programming

    我们略过概念,直接看函数式响应式编程解决了什么问题. 从下面这个例子展开: 两个密码输入框,一个提交按钮. 密码.确认密码都填写并一致,允许提交:不一致提示错误. HTML 如下: <input ...

  5. 【响应式编程的思维艺术】 (1)Rxjs专题学习计划

    目录 一. 响应式编程 二. 学习路径规划 一. 响应式编程 响应式编程,也称为流式编程,对于非前端工程师来说,可能并不是一个陌生的名词,它是函数式编程在软件开发中应用的延伸,如果你对函数式编程还没有 ...

  6. 函数响应式编程(FRP)思想-Callback风格

    序 ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP.FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁 ...

  7. RxJava(一):响应式编程与Rx

    一,响应式编程 响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式. 1.1 异步编程 传统的编程方式是顺序执行的,必须在完 ...

  8. Angular4学习笔记(五)- 数据绑定、响应式编程和管道

    概念 Angular中的数据绑定指的是同一组件中控制器文件(.ts)与视图文件(.html)之间的数据传递. 分类 流向 单向绑定 它的意思是要么是ts文件为html文件赋值,要么相反. ts-> ...

  9. spring5响应式编程

    1.Spring5新特性    2.响应式编程响应式编程:非阻塞应用程序,借助异步和事件驱动还有少量的线程垂直伸缩,而非横向伸缩(分布式集群)当Http连接缓慢的时候,从数据库到Http数据响应中也会 ...

随机推荐

  1. python 机器学习(一)机器学习概述与特征工程

      一.机器学习概述 1.1.什么是机器学习? 机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测 1.2.为什么需要机器学习? 解放生产力,智能客服,可以不知疲倦的24小时作业 ...

  2. css实现双色饼图

    from:wx--前端早读课 首先回想用css画三角形的方法: <div class="triangle"></div> .triangle { displ ...

  3. Java 解决采集UTF-8网页空格变成问号乱码

    http://blog.csdn.net/bob007/article/details/27098875 使用此方法转换后,在列表中看到的正常,但是在详情页的文本框中查看到的就是 了,只好过滤掉所有的 ...

  4. Struts2导图

  5. Kd Tree算法详解

    kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nea ...

  6. java颜色对照表

  7. 001_C语言中运算符的优先级

    总的来说就是: 1. 最高:单目运算符(() > * 解引用,&取地址,-取相反数,++等自增(或减)运算,!取反运算...); 2. 次之:双目运算符(算数运算符 > 移位运算符 ...

  8. 关于Java Web结构和SSM框架的理解

    Java Web常见的三层结构 表现层:也就是Web层,常见的框架有Spring MVC.Struts2 ,并包括用于展示的界面,如JSP界面:业务层:Service层,专注于业务逻辑的实现:持久层: ...

  9. ATX-UI自动化环境搭建

    基础环境准备(以下都是在Mac机上搭建的) 1.android sdk安装&配置 很完美的一个资源下载网:tools.android-studio.org,下载所需的包(我下的zip包直接解压 ...

  10. 解决docker创建的elasticsearch-head容器不能连接elasticsearch等问题

    在使用docker创建elasticsearch-head容器去连接elasticsearch的时候,容易出两个问题 1.不能连接elasticsearch 修改elasticsearch.yml文件 ...