[HMLY]11.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的都知道;
那么问题来了,怎么写链式编程呢?
一步步来实现一个函数式编程
- 新建项目command +shift + N
- 创建一个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 的数值会同时发生变化;
[HMLY]11.iOS函数式编程的实现&&响应式编程概念的更多相关文章
- 深入浅出-iOS函数式编程的实现 && 响应式编程概念
简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 配图 ...
- iOS开发之OC篇-响应式编程Reactive Cocoa
一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...
- 学习响应式编程 Reactor (1) - 响应式编程
响应式编程 命令式编程(Imperative Programing),是一种描述计算机所需做出的行为的编程范式.详细的命令机器怎么(How)去处理以达到想要的结果(What). 声明式编程(Decla ...
- 使用ReactiveCocoa实现iOS平台响应式编程
使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Prog ...
- [转]使用ReactiveCocoa实现iOS平台响应式编程
原文:http://www.itiger.me/?p=38 使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍 ...
- [iOS] 响应式编程开发-ReactiveCocoa(一)
什么是响应式编程 响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中 ...
- 函数响应式编程(FRP)—基础概念篇
原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...
- 函数响应式编程(FRP)从入门到”放弃”——基础概念篇
前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...
- 【响应式编程的思维艺术】 (2)响应式Vs面向对象
目录 一. 划重点 二. 面向对象编程实例 2.1 动画的基本编程范式 2.2 参考代码 2.3 小结 三. 响应式编程实现 四. 差异对比 4.1 编程理念差异 4.2 编程体验差异 4.3 数学思 ...
随机推荐
- C#用WebClient下载File时操作超时的问题
原文:C#用WebClient下载File时操作超时的问题 今天很SB,被这个问题卡住了.那段代码也是网上找的.结果发现只能下载一个文件,第二次下载的时候就会出现“操作超时”的问题. 这个是原代码: ...
- 条件变量signal与unlock的顺序
编写同步队列时,有用到条件变量,对操作队列的线程进行同步.当队列为空时,允许get线程挂起,直到add线程向队列添加元素并通过唤醒条件变量,get线程继续向下运行.条件变量在多线程程序中用来实现“等待 ...
- BrnShop:自定义插件
BrnShop开源网上商城第四讲:自定义插件 重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www ...
- Win 内存映射和堆栈
内存映射和堆栈 内存映射文件 内存映射文件可以用于3个不同的目的: 系统使用内存映射文件,以便加载和执行.exe和DLL文件.这可以大大节省页文件空间和应用程序启动运行所需的时间. 可以使用内存映射文 ...
- 使用TotoriseSVN的分支/标签功能
使用TotoriseSVN的分支/标签功能 http://blog.sina.com.cn/s/blog_5383588c0100o1oo.html 原来在新建一个项目文件夹后,再把Trunk.Bra ...
- Sql Server实现多行数据按分组用逗号分隔成一行数据
例如,要将下面的数据 以GROUP_ID进行分组,一组一行,一组中的多个PRODUCT_ID用逗号分隔,select 出来成如下结果: 在Sql Server中,我目前想到的一种方法是写一个函数,如下 ...
- ajaxFileUpload+struts2实现多文件上传
以前有介绍过ajaxFileUpload实现文件上传,但那是单文件的,这次介绍多文件上传. 单文件上传参考:http://blog.csdn.net/itmyhome1990/article/deta ...
- WebApp之PC客户端
开发WebApp之PC客户端 HTML5的跨平台性还是很好的,苹果.Android手机都可以用,所在最近使用Jquery Mobile开发了一个手机端应用程序,一次开发,多个平台使用. 但我们的很多客 ...
- 简单的HTTP过滤模块
简单的HTTP过滤模块 一.Nginx的HTTP过滤模块特征 一个请求可以被任意个HTTP模块处理: 在普通HTTP模块处理请求完毕并调用ngx_http_send_header()发送HTTP头部或 ...
- Query插件
推荐一些常用感觉不错的jQuery插件 JQuery插件繁多,下面是个人在工作和学习中用到感觉不错的,特此记录. UI: jquery UI(官方的UI插件,很好很强大功能完备,灵活性很强,有十几套主 ...