深入浅出-iOS函数式编程的实现 && 响应式编程概念
2016-06-18 01:16
627 查看
Posted by
微博@iOS音视频
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 |
Creative Commons BY-NC-ND 3.0
配图
作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit;
Masonry是一个OC开发中,非常好用的自动布局的第三方框架;
SnapKit是Masonry团队打造的swift版本的自动布局框架;
如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”!
就是这个“.”让Masonry更加鲜活的展示给了开发者,在我心中
Masnory/ SnapKit函数式编程的一个经典的代表作,非常值得参考和学习!
链式编程的好处不用再说了,用过Masnory/ SnapKit的都知道;
新建项目command +shift + N
创建一个Person类
并为其增加两个方法
简单实现:
实例化并调用相关的方法
以上三步实现了一个非常简单的程序;
最终目标
分解目标
1.先实现这种方式调用
2.再实现最终目标
显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。
这样分析后,就简单了,就是增加一个返回值。
代码
方法的声明
方法的实现
实现最终目标:
在OC中,`()`block是以
再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标!
代码:
声明
实现:
再来看一下Masonry的一个函数式编程
最终调用的函数:
返回的就是一个返回值为MASConstraint的block
如果想用()去执行,那么需要返回一个block;
如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。
在程序开发中:
a = b + c
赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;
在上篇博客中《iOS-Reactive Cocoa的常见用法》
Reactive Cocoa就是一个响应式编程的经典作品!
文/iOS音视频(简书作者)
原文链接:http://www.jianshu.com/p/7017a220f34c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
微博@iOS音视频
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 |
Creative Commons BY-NC-ND 3.0
简介
本篇主要回顾一下--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的都知道;
那么问题来了,怎么写链式编程呢?
一步步来实现一个函数式编程新建项目command +shift + N
创建一个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 的数值会同时发生变化;
在上篇博客中《iOS-Reactive Cocoa的常见用法》
Reactive Cocoa就是一个响应式编程的经典作品!
文/iOS音视频(简书作者)
原文链接:http://www.jianshu.com/p/7017a220f34c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字
- IOS的代理模式
- iOS-分段控制器-基本概念
- iOS主线程与子线程
- iOS 3DES加解密
- iOS 编码(Base64) + 哈希摘要(MD5+SHA)
- Passbook学习笔记
- 在MAC电脑上抓取iphone数据包的方法
- iOS应用的crash日志的分析基础
- IOS实现Voip应用后台运行需要的几个配置项
- iOS企业版打包(转载)
- iOS开发多线程篇—多线程简单介绍
- iOS 最新版的 CocoaPods 安装流程
- IOS中定时器NSTimer的开启与关闭
- iOS开发之推送证书制作
- iOS -[PFPASIDataCompressor compressBytes:length:error:shouldFinish:] in PFPGZIPInvocationCompressor.o
- kerkee 之Web和iOS开发使用篇
- 进程以及线程说明
- bios内存分布-编写最简单操作系统(mbr)
- ios开发——史上比较用心的纯代码实现 AutoLayout