作为一个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. 不吹牛X,我真的干掉了if-else

    我们在web开发中,经常使用数据库表中的字段作为"标记"来表示多个"状态",比如: 我们就以某宝的在线购物流程为例进行分析.在订单表中,使用zt字段来表示定单的 ...

  2. linux下获取软件源码包 centos/redhat, debian/ubuntu

    linux下获取软件源码包 centos/redhat, debian/ubuntu centos下: 1. yum install yum-utils 主要为了获取yumdownloader 2. ...

  3. redis集群复制和故障转移

    #### 一.集群的问题- 1.当某个主节点宕机后,对应的槽位没有节点承担,整个集群处于失败状态,不可用,怎么办- 2.如何判断某个主节点是否真正的岩机?- 3.如果从某个主节点的所有从节点中选举出一 ...

  4. HDU5293 树链剖分+树形DP

    =-=抓住叶节点往上揪 Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  5. NPM的由来——为什么要使用NPM

    原文:https://blog.csdn.net/qq_37696120/article/details/80507178 https://blog.csdn.net/hong10086/articl ...

  6. LeetCode树专题

    LeetCode树专题 98. 验证二叉搜索树 二叉搜索树,每个结点的值都有一个范围 /** * Definition for a binary tree node. * struct TreeNod ...

  7. COLA的扩展性使用和源码研究

    cola扩展点使用和设计初探 封装变化,可灵活应对程序的需求变化. 扩展点使用 步骤: 定义扩展点接口,类型可以是校验器,转换器,实体: 必须以ExtPt结尾,表示一个扩展点. 比如,我定义一个云枢的 ...

  8. 监控-zabbix

    1:什么是监控? 监控:安防的监控  看监控,事后追责 linux监控: 事前预警,数据分析 2:常见的linux监控命令 cpu             1 top 2 htop 3 uptime ...

  9. 读Pyqt4教程,带你入门Pyqt4 _005

    对话框窗体或对话框是现代GUI应用不可或缺的一部分.dialog定义为两个或多个人之间的交谈.在计算机程序中dialog是一个窗体,用来和程序“交谈”.对话框用来输入数据.修改数据.改变程序设置等等. ...

  10. echo改变字体颜色

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033 ...