非常激動(dòng)的和各位分享RFP的經(jīng)驗(yàn)。目前國內(nèi)使用swift開發(fā)實(shí)際項(xiàng)目的文章幾乎還找不到,不用說ReactiveCocoa了。我打算把兩個(gè)一起簡(jiǎn)單說一下。
MVC和MVVM的差異,我覺得對(duì)比實(shí)在是很細(xì),重點(diǎn)是,MVVM的分割性更好,正交性強(qiáng),而MVC在邏輯和試圖代碼方面經(jīng)常混在一起,不能很好的模塊化,以至于在多人開發(fā)的模式下,時(shí)不時(shí)出現(xiàn)邏輯混亂的情況。
另一個(gè)核心問題是,常規(guī)的編程思路在對(duì)象的依賴關(guān)系的維護(hù)方面基本無能為力。
我不想在一篇文章中扯一大把概念,MVVM的介紹和優(yōu)點(diǎn)你可以自己去搜索。

原來興致沖沖的百度了一下swift RFP/RAC/MVVM,沒實(shí)質(zhì)性內(nèi)容,干脆自己寫一篇。
就談?wù)勗趕wift中使用MVVM吧,你可以去我的github倉庫下載這里的完整代碼.
RAC在object-c中的使用在github上有實(shí)例的。各位可以移步去看一下。

環(huán)境前提是你要有xcode6,pod管理器。這些工具你應(yīng)該自己去找一下,當(dāng)然你就用我的這個(gè)項(xiàng)目也行。
說一下集成步驟:
1.使用pod添加ReactiveCocoa到工程中,細(xì)節(jié)略。
2.打開編譯xcworkspace,新建一個(gè)swift代碼文件,在建立過程中,xcode會(huì)問你是不是要建立與object-c的混編中間頭文件,選擇是,并在這個(gè)頭文件中加入RAC的頭文件
#import <ReactiveCocoa/RACEXTScope.h>
#import <ReactiveCocoa/ReactiveCocoa.h>
以及你要使用的object-c的其他庫的頭文件
3.可以使用了,新建一個(gè)swift源文件,建立一個(gè)nib文件和它關(guān)聯(lián),然后設(shè)置一個(gè)button,代碼類似這樣:

@IOBullet button:UIButton = UIButton.buttonWithType(UIButtonType.Custom)
        button.rac_signalForControlEvents(UIControlEvents.TouchUpInside)
            .subscribeNext{
                _ in
                NSLog("按鈕點(diǎn)擊事件")
        }
//加入到UI層去
測(cè)試可以使用RAC了。點(diǎn)擊這個(gè)按鈕,打印內(nèi)容就出來了
4.在swift中使用類似object-c中的RAC(button, hidden) = RACObserve(button2, hidden)是會(huì)出錯(cuò)的。需要自己實(shí)現(xiàn),object-c中的RAC()這個(gè)宏很討厭,想搞懂的可以網(wǎng)上查,我也記不清了。好了,我們來解決這個(gè)問題。
新建一個(gè)swift源碼,最好叫ReactiveCocoa.swift,加入下面的代碼:
//
//  ReactiveCocoa.swift
//  XianRenZhang
//
//  Created by kriswangw on 14/11/14.
//  Copyright (c) 2014年 kriswangw. All rights reserved.
//

public struct RAC  {
    var target : NSObject!
    var keyPath : String!
    var nilValue : AnyObject!
    
    init(_ target: NSObject!, _ keyPath: String, nilValue: AnyObject? = nil) {
        self.target = target
        self.keyPath = keyPath
        self.nilValue = nilValue
    }
    
    func assignSignal(signal : RACSignal) {
        signal.setKeyPath(self.keyPath, onObject: self.target, nilValue: self.nilValue)
    }
}

public func RACObserve(target: NSObject!, keyPath: NSString) -> RACSignal  {
    return target.rac_valuesForKeyPath(keyPath, observer: target)
}

public func <= (rac:RAC, signal:RACSignal){
    rac.assignSignal(signal)
}

public func >=( signal:RACSignal, rac:RAC){
    rac.assignSignal(signal)
}
然后我只要改變tableView的hidden屬性,scrollView的屬性就會(huì)跟著改變了,不用再去維護(hù)兩個(gè)變量。
//兩個(gè)按鈕的點(diǎn)擊切換不同的內(nèi)容。
        self.changguan_btn.rac_signalForControlEvents(UIControlEvents.TouchUpInside)
            .subscribeNext {
                _ in
                self.tableView.hidden = true;
        }
        self.zhanpin_btn.rac_signalForControlEvents(UIControlEvents.TouchUpInside)
            .subscribeNext{
                _ in
                self.tableView.hidden = false;
        }

RAC的函數(shù)思想使得代碼服用行更強(qiáng),可以讓我們把按鈕的控制寫成邏輯算法,而不是一個(gè)一個(gè)的重復(fù)的回調(diào)事件函數(shù),或者含有多個(gè)鏈接nib文件的函數(shù)(不好維護(hù))。
//TODO,修改為對(duì)應(yīng)的UIViewController.也有可能是同一個(gè)ViewController,但是參數(shù)不同
        let ciqi_vc           = UIViewController()
        let yuqi_vc           = UIViewController()
        let huihua_vc         = UIViewController()
        let wenhuajiading_vc  = UIViewController()
        let zuke_vc           = UIViewController()
        let shufa_vc          = UIViewController()
        let qingtong_vc       = UIViewController()
        let keju_vc           = UIViewController()
        
        var btns2Actions: NSDictionary = [
            "瓷器":[self.qiciBtn, ciqi_vc],
            "玉器":[self.yuqiBtn, yuqi_vc],
            "繪畫":[self.huihuaBtn, huihua_vc],
            "文化嘉定":[self.wenhuajiadingBtn, wenhuajiading_vc],
            "竹刻":[self.zukeBtn, zuke_vc],
            "書法":[self.shufaBtn, shufa_vc],
            "青銅":[self.qingtongBtn, qingtong_vc],
            "科舉":[self.kejuBtn, keju_vc]]
        //定制每個(gè)button事件跳轉(zhuǎn)的視圖控制器。
        for (key : AnyObject, value : AnyObject ) in btns2Actions {
            let array = value as NSArray;
            let btn        = array[0] as UIButton;
            let vc:UIViewController = array[1] as UIViewController;
            btn.rac_signalForControlEvents(UIControlEvents.TouchUpInside)
                .subscribeNext { _ in
                    self.navigationController.pushViewController(vc, animated:false)
            }
        }
這段代碼展示了使用抽象來統(tǒng)一所有事件響應(yīng)的功能。每一個(gè)按鈕對(duì)應(yīng)的視圖控制器都被綁定到一起了,如果新加入別的功能,代碼仍然非常容易維護(hù)。所有功能相同的都放在了一起,約束性更強(qiáng)。

其他的RAC功能基本上默認(rèn)就能使用,combineLatest也是可以直接使用的。記住swift中的所有方法調(diào)用都是"."下標(biāo)符號(hào),包括靜態(tài)方法,init和隱式析夠除外。

swift中沒有#pragma宏,所以,它提供了這個(gè)注釋風(fēng)格(內(nèi)置的)
// MARK:// TODO: and // FIXME
可以達(dá)到和#pragma一樣的效果
最后,swift和RFP都是非常好的東西,希望各位盡快用上,不然你要掉隊(duì)了