V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
tangqiaoboy
V2EX  ›  iDev

ReactiveCocoa - iOS开发的新框架

  •  
  •   tangqiaoboy · 2014-02-11 12:14:08 +08:00 · 4386 次点击
    这是一个创建于 3967 天前的主题,其中的信息可能已经有所发展或是发生改变。
    春节研究ReactiveCocoa,写了一个面向初学者的入门介绍:

    http://blog.devtang.com/blog/2014/02/11/reactivecocoa-introduction/

    摘要内容如下:


    什么是ReactiveCocoa

    ReactiveCocoa(其简称为RAC)是由Github 开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性。它主要吸取了.Net的 Reactive Extensions的设计和实现。

    ReactiveCocoa试图解决什么问题

    经过一段时间的研究,我认为ReactiveCocoa试图解决以下3个问题:

    传统iOS开发过程中,状态以及状态之间依赖过多的问题
    传统MVC架构的问题:Controller比较复杂,可测试性差
    提供统一的消息传递机制
    传统iOS开发过程中,状态以及状态之间依赖过多的问题

    我们在开发iOS应用时,一个界面元素的状态很可能受多个其它界面元素或后台状态的影响。

    例如,在用户帐户的登录界面,通常会有2个输入框(分别输入帐号和密码)和一个登录按钮。如果我们要加入一个限制条件:当用户输入完帐号和密码,并且登录的网络请求还未发出时,确定按钮才可以点击。通常情况下,我们需要监听这两个输入框的状态变化以及登录的网络请求状态,然后修改另一个控件的enabled状态。

    试图解决MVC框架的问题

    对于传统的Model-View-Controller的框架,Controller很容易变得比较庞大和复杂。由于Controller承担了Model和View之间的桥梁作用,所以Controller常常与对应的View和Model的耦合度非常高,这同时也造成对其做单元测试非常不容易,对iOS工程的单元测试大多都只在一些工具类或与界面无关的逻辑类中进行。

    RAC的信号机制很容易将某一个Model变量的变化与界面关联,所以非常容易应用Model-View-ViewModel 框架。通过引入ViewModel层,然后用RAC将ViewModel与View关联,View层的变化可以直接响应ViewModel层的变化,这使得Controller变得更加简单,由于View不再与Model绑定,也增加了View的可重用性。

    因为引入了ViewModel层,所以单元测试可以在ViewModel层进行,iOS工程的可测试性也大大增强了。InfoQ也曾撰文介绍过MVVM:《MVVM启示录》 。

    统一消息传递机制

    iOS开发中有着各种消息传递机制,包括KVO、Notification、delegation、block以及target-action方式。各种消息传递机制使得开发者在做具体选择时感到困惑,例如在objc.io上就有专门撰文(破船的翻译 ),介绍各种消息传递机制之间的差异性。

    RAC将传统的UI控件事件进行了封装,使得以上各种消息传递机制都可以用RAC来完成。

    ReactiveCocoa的特点

    RAC在应用中大量使用了block,由于Objective-C语言的内存管理是基于引用计数 的,为了避免循环引用问题,在block中如果要引用self,需要使用@weakify(self)和@strongify(self)来避免强引用。另外,在使用时应该注意block的嵌套层数,不恰当的滥用多层嵌套block可能给程序的可维护性带来灾难。

    RAC的编程方式和传统的MVC方式差异巨大,所以需要较长的学习时间。并且,业界内对于RAC并没有广泛应用,这造成可供参考的项目和教程比较欠缺。 另外,RAC项目本身也还在快速演进当中,1.x版本和2.x版本API改动了许多,3.0版本也正在快速开发中,对它的使用也需要考虑后期的升级维护问题。

    作为一个iOS开发领域的新开源框架,ReactiveCocoa带来了函数式编程和响应式编程的思想,值得大家关注并且学习。


    一些学习资源

    博客&教程

    http://spin.atomicobject.com/2014/02/03/objective-c-delegate-pattern/
    http://blog.bignerdranch.com/4549-data-driven-ios-development-reactivecocoa/
    http://en.wikipedia.org/wiki/Functional_reactive_programming
    http://www.teehanlax.com/blog/reactivecocoa/
    http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/
    http://nshipster.com/reactivecocoa/
    http://cocoasamurai.blogspot.com/2013/03/basic-mvvm-with-reactivecocoa.html
    http://iiiyu.com/2013/09/11/learning-ios-notes-twenty-eight/
    https://speakerdeck.com/andrewsardone/reactivecocoa-at-mobidevday-2013
    http://msdn.microsoft.com/en-us/library/hh848246.aspx
    http://www.itiger.me/?p=38
    http://blog.leezhong.com/ios/2013/12/27/reactivecocoa-2.html
    https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/FrameworkOverview.md
    http://www.haskell.org/haskellwiki/Functional_Reactive_Programming
    http://blog.zhaojie.me/2009/09/functional-reactive-programming-for-csharp.html
    代码

    https://github.com/Machx/MVVM-IOS-Example
    https://github.com/ReactiveCocoa/RACiOSDemo
    书籍

    https://leanpub.com/iosfrp
    视频

    5 条回复    2016-01-29 10:57:09 +08:00
    wtl
        1
    wtl  
       2014-02-11 12:36:02 +08:00
    非常全 赞一个
    MVVM个人觉得无所谓 就是把大的模块拆成小的 再复杂一些 MVMXV也是可以的嘛 用不用看程序规模了
    倒是其中Pipeline式的编程方式 真的是把人解放了出来
    gsanidt
        2
    gsanidt  
       2014-02-11 12:37:20 +08:00
    巧哥也混这里
    favormm
        3
    favormm  
       2014-02-12 18:52:47 +08:00 via iPhone
    不错,这东西好用。我也想在我团队推广应用
    favormm
        4
    favormm  
       2014-02-12 22:24:29 +08:00 via iPhone
    原来唐巧兄也在这儿。
    Pasco
        5
    Pasco  
       2016-01-29 10:57:09 +08:00
    刚开始学习,谢谢唐巧大大:-)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   880 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:00 · PVG 04:00 · LAX 12:00 · JFK 15:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.