作为一个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. 黑马程序员_毕向东_Java基础视频教程——转义字符(随笔)

    转义字符 转义字符 通过 \ 来转变后面的字母或符号的含义 \n :换行 \b :退格.相当于 backspace \r : 相当于回车键. Windows系统中,回车是由两个字符来表示 \r \n. ...

  2. css多行省略和单行省略

    实现文本省略: <!-- html代码 --> <p class="single">该文的主题思想即对自由境界的向往.朱自清当时虽置身在污浊黑暗的旧中国,但 ...

  3. 【雕爷学编程】MicroPython动手做(01)——春节后入手了K210开发板

    Python的开放.简洁.黏合正符合了现发展阶段对人工智能.大数据分析.可视化.各种平台程序协作产生了快速的促进作用.自Python3的发布到现在已有五六年的时间,从刚发布的反对声音到慢慢被接受与喜欢 ...

  4. Flutter仿掘金点赞效果

    老孟导读:今天分享一下如何实现掘金点赞效果,这不仅仅是一篇技术文章,还是一篇解决问题思路的文章,遇到一个需求时,如何拆分需求,然后一步一步实现,这个过程比单纯的技术(此文)更有含金量. 先来看一下掘金 ...

  5. PL/SQL语言语法

    一.前言 SQL全称是"结构化查询语言(Structured Query Language)",而PL/SQL是过程语言(Procedure Language),是对SQL的扩展. ...

  6. 一个导致JVM物理内存消耗大的Bug

    概述 最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的.在查的过程中,阴差阳错地发现了JVM另外的一个Bug.这个B ...

  7. java数值类型之间的转换

    说明:图中6个实心箭头代表转换无信息丢失,3个虚线箭头表示可能有精度损失的转换.

  8. PHP 数据库操作函数笔记

    /建立 或者 关闭mysql服务器 @符号用于屏蔽错误信息 $link=@mysqli_connect('127.0.0.1','root','123456','php1',3306); if(mys ...

  9. vue过渡动画样式

    在进入/离开的过渡中,会有 6 个 class 切换. v-enter:定义进入过渡的开始状态.在元素被插入之前生效,在元素被插入之后的下一帧移除. v-enter-active:定义进入过渡生效时的 ...

  10. nginx: [error] invalid PID number "" in ...

    1.查看进程 ps -ef|grep nginx 2.进入nginx安装目录sbin下,执行命令: ./nginx -t 如下显示: syntax is ok test is successful 3 ...