作为一个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. windows下node配置npm全局路径(踩坑)

    事情的起因是:Koa要求v7.6.0以上的nodejs. 但是window环境下升级node不容易,试过npm install -g n 和n stable等命令无效,而网上推荐的nvm并不支持win ...

  2. react-debug

    最近练习react的时候遇到一些问题: 在redux模式下,同一个api依据参数获取不同data的时候,返回的data相同 原因:多次调用该接口时,action的type相同,导致对应于该接口的每个r ...

  3. 字符串 kmp算法 codeforce 625B 题解(模板)

    题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...

  4. 6.2 Go 匿名字段

    6.2 Go 匿名字段 Golang匿名字段:可以像访问字段成员那样,访问匿名字段方法,go编译器自动查找. package main import "fmt" type Stud ...

  5. 第一章 Python 基础

    1. 为什么学习 Python? 答题路线:a.python的优点,b.python的应用领域广 具体: 优点 1.python语法非常优雅,简单易学 2.免费开源 3.跨平台,可以自由移植 4.可扩 ...

  6. Chipmunk-js物理引擎学习笔记

    一.基本概念## 空间:在Chipmunk中,空间是所有对象容器.因此,刚体.形状.链接节点等对象都需要添加到空间中.空间控制这些对象的相互作用. 刚体:物理上的刚体指的是在运动和受力作用后,形状和大 ...

  7. 如何安放你的大文件,MongoDB GridFS可以帮助你

    1 简介 众所周知(你不知也当你知),MongoDB是以文档(Document)组织数据的.除了常用于存储Json数据,它也是可以存储普通文件的.我们可以把一些文件以BSOON的格式存入MongoDB ...

  8. mysql基本操作汇总

    1.数据库操作 (1)创建数据库 CREATE DATABASE <数据库名>; 例子: CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHAR ...

  9. Django中的事务与ajax

    一 事务与锁 1.行级锁 行级锁是由存储引擎实现的.如mysql里默认指定的InnoDB存储引擎,由它实现行级锁.InnoDB的行级锁定同样分为两种类型,共享锁(X)和排他锁(S). 对于UPDATE ...

  10. CF922F Divisibility

    题目链接:http://codeforces.com/contest/922/problem/F 题目大意: 对于一个数集 \(I\),定义 \(f(I)\) 为 \(I\) 中满足条件的数对\((a ...