iOS 函数响应式编程 (ReactiveCocoa)-- 前篇

欢迎加QQ群讨论:157672725

前言

近来,Q群的几个朋友谈起如何使用ReactiveCocoa(以下简称RAC)开发的问题。大家觉得RAC很好,但不知如何运用它。在此整理一些对RAC的看法,希望对学习RAC的朋友有所帮助。本篇是前篇,主要涉及以下内容。

  • 现有的编程问题
  • 为何出现了这些问题
  • 编程思想的变化

现有的编程问题

  1. 状态量问题(类似Cache问题)
    在开发中时常需要一些状态量来辅助处理事务。比如:按下登录按钮后发起请求时需要一个状态量(isRequesting)来标注正在请求。


    状态量问题

    但是由于isRequesting的改变相对随意,也时常会忘记对它正确赋值,导致难以维护。这也就跟Cache中的难点(难以知道何时去更新Cache中的值)一样。另外,当状态量多起来时便会出现组合爆炸的问题(状态成指数级增长),不利于扩展及维护。

  2. Controller爆炸问题
    随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2,3千行,甚至更多。这带来了许多问题:1.不利于后续维护2.不利于支撑UI的变动3.不利于复用 4….

  3. 消息传递机制方式繁多,带来的选择性问题
    iOS 开发中有着各种消息传递机制,包括 KVO、block、Notification、delegation以及 target-action 方式。各种消息传递机制使得开发者在做具体选择时感到困惑,虽然有不少大牛分享了他们选择的经验(如:开发该选择Blocks还是Delegates),但是在开发中始终觉得繁琐。重点是如果选择错了方式,极不利于代码质量的保证。


为何出现了这些问题

1
2
3

从上面几张图我们可以看出,app其实是一个输入-》处理-》输出的过程。而它随着输入输出的增多,开发的难度也越来越大。抽象一点来讲就是变化越多,控制越难。

传统的命令式编程,是以命令为主的,给机器提供一条又一条的命令序列让其原封不动的执行,这就限制了编程的灵活性。
变化(输入、输出)越来越多-》分支越来越多-》状态量问题
变化越来越多-》Handler处理的实务越来越多-》Controller爆炸问题(可通过MVVM模式解决)
变化越来越多-》需要不同的消息处理机制-》消息传递机制方式的选择问题
……

既然命令式编程不能满足我们的需求,那便寻求解决之法。于是我们想到了Functional Reactive Programming。


编程思想的变化

最近关于是否使用RAC的讨论非常多。相当一部分的原因是RAC的学习成本高在团队协作中需要每个人都学会使用。使用了一段时间后,个人觉得RAC学习成本高的原因是编程思想上的改变。
RAC运用的响应式编程(Functional Reactive Programming,以下简称FRP)与传统的命令式编程思想差异较大。下面我们先来了解一下RAC使用的FRP思想。

RAC中的函数式思想

  1. 高阶函数:函数作为参数来回传递。在oc中,block是被广泛使用的参数传递,它实际上是匿名函数。
    例:


    高阶函数

    上面的例子中先使用filter(过滤)判断value是否有“catch”前缀,然后使用map(映射)将值映射成no more,最后输出。不难看出例子中的filter 和 map block正是高阶函数的应用。

  2. 惰性求值:只有当被使用到时,才会对其求值。在RAC中信号只有被订阅了,才会触发
    例:
    惰性求值

    将例子中的订阅部分注释,会发现虽然username改变了但是filter 和map不会触发,这就是惰性求值思想的应用。
    在RAC中将未被订阅的信号称为“冷信号”,将已被订阅的信号称为“热信号”
    例2:
    惰性求值2

    RACSequence只有当被使用到时,才会对其求值(当注释掉订阅的时候,断点是不触发的),这也是惰性求值思想的应用。

RAC中的响应式思想

响应式编程是一种和事件流有关的编程模式,关注导致状态值改变的行为事件,一系列事件组成了事件流。一系列事件是导致属性值发生变化的原因。FRP非常类似于设计模式里的观察者模式
例:

RAC中的响应式思想

在传统命令式的编程中可解读成:a是 b + c 表达式的值。
而在响应式的编程中应解读成:建立了一个动态的数据流关系(当c或者b的值发生变化时,a的值自动发生变化)。


小结

本篇概述了RAC与传统编程方式的区别,下一篇开始,我们将利用RAC来开发一个完整的应用,以此来边掌握RAC的知识。这期就到这了,下期见。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容