什么是ReactiveCocoa

如果你有看Github的Trending Objective-C榜单,那你肯定是见过ReactiveCocoa了。如果你在weibo上关注唐巧、onevcat等国内一线知名开发者。那也应该听说过ReactiveCocoa了。

ReactiveCocoa更加被Mattt Thompson大神称为开启一个新Objective-C纪元。

当然也有人声称ReactiveCocoa是Cocoa的未来。ReactiveCocoa: The Future of Cocoa Programming

我自己粗犷把现在的Objective-C分为两个阶段。

第一个阶段就是我学Cocoa开发之前的阶段:就是把Objective-C做出来的那群NeXT的大神,确定面向对象思想,确定消息机制,确定各种模式最后变成了Apple的主力开发语言。到后面OS X的各种库。iOS的各种库。

第二个阶段就是我学Cocoa开发之后的阶段:开始clang发力,配合Objective-C的快速进化:ARC,block,现代Objective-C语法。使其Objective-C不断获得现代语言类如Ruby, Python的优秀特性。

现在,说的最多的就是ReactiveCocoa将会把Objective-C带到下一个里程碑中。

ReactiveCocoa是一个基于Functional Reactive Programming编程思想的Objective-C实现开源的第三方库。最初的作者是Github的大神(Josh Abernathy & Justin Spahr-Summers)。应该是再开发Github For Mac时候的附属产物。当然,我们必需得明白有时候附属产物要比真主牛逼的多了去了。比如万艾可,再比如青霉素,再再比如老干妈。

等等 什么是Functional Reactive Programming

Functional Reactive Programming

wiki解释

Reactive Programming

wiki 响应式编程

Functional programming

wiki Functional programming

恩 简单来说

Functional Reactive Programming = Functional programming + Reactive Programming

(PS:特么太偷懒了还是解释一下)

简单以

a = b + c

为例

通常情况下在执行a = b + c的值的时候b和c当时是什么值。a就是当时的b+c。然后后来不管b和c怎么变化,a都不会改变。

但是在Execl中设置a格子=b格子+c格子的值。a的值就会随着b和c值的改变而改变。然后我还可以搞的高级一点f = a + d。 f格子的值也会随着b、c、d的值而改变。这就是使用Functional Reactive Programming以后会发生的情况。

Reactive的特性使得可以随时响应变化。Functional的特性使得他们可以串起来。

来自微软实验室的编程思想

ReactiveCocoa的readme我们看到ReactiveCocoa是基于.NET的Reactive Extensions(Rx)来的。啧啧身为一个脑残果粉不解释的我。也必须承认微软其实曾经一度集聚这世界上一大批大牛。这批大牛在闲着玩的时候做出来的玩具也指不定哪天就拯救世界了。

Rx

所以我也找了点Rx的资料来看看

中文里面比较全面的是这个
Reactive Extensions入门

里面有一堆链接和一个视频。c#实在看不懂,就只看了15分钟左右。不过那看上去蛮帅的哥们一开始说他在编程中遇到的问题。恰巧是我最近遇到的问题:就是我有两个在非主线程的异步操作。而我有可能需要等两个异步操作都完成的时候进行下一步操作。这种情况我一直没有找到比较优美的解决方法。直到遇见ReactiveCocoa,仿佛看见了希望。

Model-View-ViewModel

洋文wiki

中文wiki

FRP倾向于技术理论上的方法论。MVVM则是程序模式的方法论。就好比FRP给了一把解牛的刀。MVVM就是如何解牛的方法论。

相对来说MVVM通常跟MVC拿来比较。在我看来,没有绝对的好和坏。找个适合的就好了。再说我对两个东西的了解不够深入。

Basic MVVM with ReactiveCocoa

这篇blog应该就写的蛮清楚了。

这是github上iOS的 MVVM例子MVVM-IOS-Example

大家可以感受一下。

ReactiveCocoa的基本使用方法

(终于写到正主了,泪流满面)

这里借用Limboy的blog中的一段话作为开场解释。(因为我想了好久都没有想出超过他的比喻方法)

ReactiveCocoa是github去年开源的一个项目,是在iOS平台上对FRP的实现。FRP的核心是信号,信号在ReactiveCocoa(以下简称RAC)中是通过RACSignal来表示的,信号是数据流,可以被绑定和传递。
可以把信号想象成水龙头,只不过里面不是水,而是玻璃球(value),直径跟水管的内径一样,这样就能保证玻璃球是依次排列,不会出现并排的情况(数据都是线性处理的,不会出现并发情况)。水龙头的开关默认是关的,除非有了接收方(subscriber),才会打开。这样只要有新的玻璃球进来,就会自动传送给接收方。可以在水龙头上加一个过滤嘴(filter),不符合的不让通过,也可以加一个改动装置,把球改变成符合自己的需求(map)。也可以把多个水龙头合并成一个新的水龙头(combineLatest:reduce:),这样只要其中的一个水龙头有玻璃球出来,这个新合并的水龙头就会得到这个球。

替代KVO

官方例子:官方的例子貌似用了比较老的函数。 我改完以后看见什么是函数响应式编程(Functional Reactive Programming:FRP)他也是这么改的。说明一下。

1
2
3
4
5
6
@property (strong) NSString *username;

[RACAble(self, username) subscribeNext:^(NSString *newName) {
NSLog(@"%@", newName);
}];

在这句代码以后,只要你的username有变化。都可以打印出来。实现了KVO的功能却减少了无数的代码。体现了绑定和响应。

高级一个点的官方例子

1
2
3
4
5
6
7
[[RACAble(self, username)
filter:^(NSString *newName) {
return [newName hasPrefix:@"j"];
}]
subscribeNext:^(NSString *newName) {
NSLog(@"%@", newName);
}];

第一个例子是简单的所有变化都会响应到。但是可能我只想响应部分情况。这时候就用filter来过滤。filter的block返回YES的情况就是需要触发的情况。其他就补返回。所以这代码以后。 username以j开头的才能打印出来。

流的实现

以下是Getting Started with ReactiveCocoa的例子和图片

如何以最少的代码实现一个时钟应用

1
2
3
4
5
RAC(self.textField.text) = [[[RACSignal interval:1] startWith:[NSDate date]] map:^id(NSDate *value) {
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:value]; return [NSString stringWithFormat:@"02%ld:%02ld:%02ld",(long)dateComponents.hour, dateComponents.minute, (long)dateComponents.second];
}];

实现的逻辑顺序是这样的。设置一个间隔为一秒。从现在开始调用的函数。并把当前实际传入。 这个函数返回一个NSString。 然后把这个NSString和界面上的textField绑定在了一起。从而实现了我认为我见过最简单时钟程序。表现了流和绑定响应。

原blog中对上述代码的流的形容图

组合

几乎每个ReactiveCocoa的Demo里面都会出现的例子。

(继续盗图图)

这个是用的leezhong的图。 应该是从这个演讲PPT里面来的,点过去还有视频哦

就是说在必需验证每个所填写的数值符合标准。Button才能点击。

1
2
3
RAC(self.submitButton.enabled) = [RACSignal combineLatest:@[self.usernameField.rac_textSignal, self.passwordField.rac_textSignal] reduce:^id(NSString *userName, NSString *password) {
return @(userName.length >= 6 && password.length >= 6);
}];

简单的解释就是把usernameField和passwordField的信号绑定在了一起做reduce处理以后。返回一个BOOL值去跟self.submitButton.enabled进行绑定。

囧。再次发现和leezhong借用的代码和图都是一样的。

异步和网络

(丢个链接 等心情好了 在补。。。)

when-to-use-reactivecocoa

总结

其实我对ReactiveCocoa了解还是在hello world阶段。 很多东西都理解的很粗糙。上面这一大陀blog。很多地方写的肯定不好。欢迎指出。其实很多时候觉得确实中文原创的技术文章十分少。很大一部分都是翻译的。国外的技术文章也确实写的牛写的好。但是总觉得自己应该写点自己思考的东西。

对于ReactiveCocoa来说,我认为它确实是一个好东西。正如leezhong所说
RAC统一了对KVO、UI Event、Network request、Async work的处理,因为它们本质上都是值的变化(Values over time)。

其实App上90%的操作不就只有这些么。所以我会一直对ReactiveCocoa投入时间去学习和使用。顺便说一句。阿里Mac Lab出品的Xiami for Mac。是我见过国内最好的Mac App之一。他们也用了ReactiveCocoa。然后你可以想象对他们做出那些响应交互ReactiveCocoa为他们提供了强有力的输出。

参考资料

转载自:http://iiiyu.com/2013/09/11/learning-ios-notes-twenty-eight/

FRP

wiki Functional reactive programming

趣味编程:Functional Reactive Programming

haskell Functional Reactive Programming

wiki 响应式编程

wiki Functional programming

函数式反应型编程(FRP) —— 实时互动应用开发的新思路

什么是函数响应式编程(Functional Reactive Programming:FRP)

Reactive Extensions入门

ReactiveCocoa

ReactiveCocoa与Functional Reactive Programming

Better Code for a Better World by Josh Abernathy

nshipster Reactive​Cocoa

ReactiveCocoa: The Future of Cocoa Programming

Getting Started with ReactiveCocoa

Functional Reactive Programming on iOS with ReactiveCocoa

Basic Operators

Basic MVVM with ReactiveCocoa
MVC - One Pattern to Rule them all

How I Wrote Vinylogue for iOS With ReactiveCocoa

来自好友RoCry的推荐

ReactiveCocoa at MobiDevDay 2013

ReactiveCocoa at MobiDevDay 2013视频

Input and Output

ReactiveCocoa 迎接下一个更加美好的世界的更多相关文章

  1. 你要相信你所做的一切对一个更美好的世界 Do have faith in what you are doing All for a better world

    http://www.nowamagic.net/librarys/veda/detail/2502 Do have faith in what you are doing. 先不要往下看,试试品尝上 ...

  2. 【深度学习与神经网络】深度学习的下一个热点——GANs将改变世界

    本文作者 Nikolai Yakovenko 毕业于哥伦比亚大学,目前是 Google 的工程师,致力于构建人工智能系统,专注于语言处理.文本分类.解析与生成. 生成式对抗网络-简称GANs-将成为深 ...

  3. 傅盛读书笔记:下一个Moonshot是什么?

    猎豹移动CEO 傅盛 九月底,我有幸在硅谷拜访了苹果前CEO斯卡利.老人如今已经75岁高龄,但看起来仍充满活力.他花了一上午的时间跟我们沟通,非常谦和.平等.坦诚,给我留下了很深的印象.末了,给我们介 ...

  4. NASA的下一个十年(译)

    原文 MICHAEL ROSTON (New York Times) 从左起:木卫二:土卫六:经过火星的水手谷星的合成图:金星的拼接图 大多数人已经从人类第一次近距离看到冥王星的兴奋中冷静下来.下一个 ...

  5. Linux游(1): diff, patch和quilt (下一个)

    Linux游(1): diff, patch和quilt (下一个) 2 quilt 我们自己的项目可以用cvs或svn管理所有代码.但有时我们要使用其它开发人员维护的项目.我们须要改动一些文件.但又 ...

  6. Token:共识的下一个100年,区块链技术是无可阻挡的文明进程

    Token:共识的下一个100年,区块链技术是无可阻挡的文明进程.很少有人意识到,区块链的应用——Token可能是近100年来最伟大的制度创新,超越股份制,并将是『债券』之后最重要最主流的交易品种,没 ...

  7. 把握这两点,抢占下一个电商风口|2016最新中国电商App排名&研究报告

    序言 电商,是随着中国互联网经济的持续发展所成长起来的.淘宝.京东这些电商从交易额和影响力上看都位列中国最为成功.最具话题性的互联网企业之中.尽管近几年中国经济有所放缓,但中国消费市场的增长速度仍有望 ...

  8. "UX"将会是下一个Buzzword?

    “用户体验非常重要”.“没有用户体验就没有产品”.“UX就是一切”.不知道从何时开始,用户体验(UX) 这个名词已经变得如此多见了,但是人们真正的认识.认清了什么是用户体验了吗?设计师们常挂在嘴边的用 ...

  9. AngularJS - 下一个大框架

    AngularJS AngularJS是web应用的下一个巨头. AngularJS如果为创建web应用而设计,那它就是HTML的套路了.具有数据绑定, MVW, MVVM, MVC, 依赖注入的声明 ...

随机推荐

  1. Careercup - Microsoft面试题 - 5672369481842688

    2014-05-12 06:27 题目链接 原题: Find the max height of a binary tree. 题目:计算二叉树的最大高度. 解法:最大高度?高度不就是最深的叶子节点到 ...

  2. Python Flask构建可拓展的RESTful API

    1-1 Flask VS Django 1-2  课程更新维护说明: 1-3 环境.开发环境与Flask: 1.3.1 关注版本更新说明: 1-4 初始化项目:

  3. jquery判断元素是否存在在数组中

    var myArray = new Array(); function checkRepeat(sel) { console.log("索引是:" + $.inArray(sel, ...

  4. 只显示前几条数据的sql语句写法 七种数据库中Select Top的使用方法

    七种数据库中Select Top的使用方法 1. Oracle数据库 SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库 SELECT ...

  5. express中放置静态文件

    不使用模版引擎的话要直接添加html,可以使用express.static()中间件设定静态文件目录,然后将html文件放在里面,如:express默认静态文件目录为 app.use(express. ...

  6. HDU 3853 LOOPS 概率DP入门

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total Sub ...

  7. mongoDB最新版安装

    转载自:http://www.higis.org/2012/04/25/ubuntu-install-mongodb/ ubuntu上安装mongodb本可以直接通过sudo apt-get inst ...

  8. 8个学习.net的博客链接 (以前收藏过更多的,被百度新版搞没了,恨死了)

    原文发布时间为:2012-09-18 -- 来源于本人的百度文章 [由搬家工具导入] Simone Chiaretta’s CodeClimber http://www.haacked.com/ (  ...

  9. .net显示今天农历的代码!

    原文发布时间为:2010-04-11 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Globalization;//namespace Proje ...

  10. js2:事件的学习,弹出窗口,状态栏字改变,地图热点的使用

    原文发布时间为:2008-11-08 -- 来源于本人的百度文章 [由搬家工具导入] <html> <head> <title>js</title> & ...