返回 登录
0

深入浅出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")
  }

实例化并调用相关的方法:

 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的数值会同时发生变化。

感谢作者Yangsc对本文的授权。

作者简介: Yangsc,曾就职于RaiseChip,负责底层驱动的编写、音频、视频驱动的编写和优化、目前在北京从事iOS音视频相关的开发,微博:O_oYangsc,博客:http://www.jianshu.com/users/9913981cb400/latest_articles

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。

图片描述

2016年3月18日-19日,由CSDN重磅打造的数据库核心技术与实战应用峰会、互联网应用架构实战峰会将在上海举行。这两场峰会将邀请业内顶尖的架构师和技术专家,共同探讨高可用/高并发系统架构设计、新技术应用、移动应用架构、微服务、智能硬件架构、云数据库实战、新一代数据库平台、产品选型、性能调优、大数据应用实战等领域的热点话题与技术。

2月29日24点前仍处于最低六折优惠票价阶段,单场峰会(含餐)门票只需799元,5人以上团购或者购买两场峰会通票更有特惠,限量供应,预购从速。(票务详情链接)。

评论