zoukankan      html  css  js  c++  java
  • 深入浅出-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 的数值会同时发生变化;



    文/iOS音视频(简书作者)
    原文链接:http://www.jianshu.com/p/7017a220f34c
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
    iis6 伪静态 iis配置方法 【图解】
    您来自的链接不存在 帝国CMS
    帝国cms Warning: Cannot modify header information headers already sent by...错误【解决方法】
    .fr域名注册 51元注册.fr域名
    帝国网站管理系统 恢复栏目目录 建立目录不成功!请检查目录权限 Godaddy Windows 主机
    星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
    ASP.NET 自定义控件学习研究
    CSS层叠样式表之CSS解析机制的优先级
    ASP.NET程序员工作面试网络收藏夹
  • 原文地址:https://www.cnblogs.com/Ghosgt/p/6071941.html
Copyright © 2011-2022 走看看