首页 > 技术文章 > Event Loop、函数式编程、IO多路复用、事件驱动、响应式、

liyonghua 2018-01-12 15:53 原文

编程思想

iOS之ReactiveCocoa简介和使用(一)

1.编程思想

在开发中我们也不能太依赖于某个框架,否则这个框架不更新了,导致项目后期没办法维护,比如之前Facebook提供的Three20框架,在当时也是神器,但是后来不更新了,也就没什么人用了。因此我感觉学习一个框架,还是有必要了解它的编程思想

1.1 面向过程:处理事情以过程为核心,一步一步的实现。

1.2 面向对象:万物皆对象

1.3 链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)

  • 链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

  • 代表:masonry框架。

  • 练习一:模仿masonry,写一个加法计算器,练习链式编程思想。

1.4 响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

  • 代表:KVO运用。

  • 练习二:KVO底层实现。

1.5 函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。

  • 函数式编程本质:就是往方法中传入Block,方法中嵌套Block调用,把代码聚合起来管理
  • 函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)

  • 代表:ReactiveCocoa。

  • 练习三:用函数式编程实现,写一个加法计算器,并且加法计算器自带判断是否等于某个值.

2.ReactiveCocoa编程思想

ReactiveCocoa结合了几种编程风格:

函数式编程(Functional Programming)

响应式编程(Reactive Programming)

所以,你可能听说过ReactiveCocoa被描述为函数响应式编程(FRP)框架。


 

简单划分关系

除了函数式编程、其它概念有一定相似性,或者说是从不同角度、在不同环境下的叫法。

1、IO多路复用、事件驱动、响应式 概念类似或者一样

就是很多网络连接(多路),共(复)用少数几个(甚至是一个)线程。

连接很多的时候,不能每个连接一个线程,会耗尽系统内存的。线程也不能阻塞在任何一个连接上,等新的数据来,这样就不能及时响应其他连接发来的数据了;也不能用非阻塞方式,轮询所有的连接,这会浪费掉大量CPU时间;只能告诉系统,我对哪些连接感兴趣,有消息来的时候,通知我处理。

2、Event Loop (比如iOS Run Loop)单线程中处理任务(一般来讲,一个线程一次只能执行一个任务)(实现这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。)
 
3、函数式编程
函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。
多核CPU是将来的潮流,所以函数式编程的这个特性非常重要。
举例:
请看下面的代码:
var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);
由于s1和s2互不干扰,不会修改变量,谁先执行是无所谓的,所以可以放心地增加线程,
因为s1可能会修改系统状态,而s2可能会用到这些状态,所以必须保证s2在s1之后运行,自然也就不能部署到其他线程上了。
 

函数式编程:

  语言层面的感念

  为什么这两年函数式编程又火起来了呢?

  0:在C++ Java中都是语法糖等级的东西,换言之不加入一样也有高阶函数。

  1:Python, C#, Perl, JS, VB, 都是2010前加入Lambda的(Dart, Swift的确有2010后Lambda,不过他们俩就是2010后出的语言)

  2:如果说其他的,C#, Python的List Comprehension也是2010前的,Java Generic则是1998由Philip Walder(Haskell界大佬), Martin Odersky(Scala界大佬)搞出来的

  3:如果要说更远的影响力,Smalltalk都被Lisp严重影响,然后Smalltalk再影响现在一大推OO语言。

Event Loop:

  常用于前端开发的一种技术?

  多用于前端概念 JavaScript    Node.js(解释和执行JavaScript代码的平台,用于后端)    iOS的Run loop

   JavaScript 运行机制详解:再谈Event Loop

IO多路复用:

  一种在后端网络编程中的一种技术

  空管员管理飞机例子 见:  IO 多路复用是什么意思?

  IO多路复用机制详解    服务器,并发,“事件驱动”的本质    IO多路复用机制详解

事件驱动:

  处理事物方式上的叫法?

  Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动非阻塞式 I/O 的模型,使其轻量又高效。

响应式编程:

  一种突出技术特点式的叫法?

  Reactive Programming

  响应式编程是一种面向数据流和变化传播的编程范式

  例如,在命令式编程环境中,a:=b+c表示将表达式的结果赋给a,而之后改变b或c的值不会影响a。但在响应式编程中,a的值会随着b或c的更新而更新。

  例如,在MVC软件架构中,响应式编程允许将相关模型的变化自动反映到视图上,反之亦然。

  例如,电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。

  iOS相关:ReactiveCocoa   RxSwift

  

推荐阅读