ReactiveCocoa學習

版本

到我寫這篇文章為止,ReactiveCocoa版本為5.0.1,搜了很多博客來了解ReactiveCocoa的基礎用法,并不是很多,所以這篇文章算是自己對搜索資源的一個匯總,并加入一些自己在學習中遇到的問題和解決.

RAC 5.0 相比于 4.0 有了巨大的變化殊校,不僅是受 swift 3.0 大升級的影響,RAC 對自身項目結構的也進行了大幅度的調整炬守。這個調整就是將 RAC 拆分為四個庫:ReactiveCocoa, ReactiveSwift, ReactiveObjC, ReactiveObjCBridge.

在項目里現(xiàn)在到底要引入哪些

如果你的項目是純 OC 項目涛救,你需要使用的是 ReactiveObjC 畏邢。這個庫里面包含原來 RAC 2 的全部代碼。
如果你只是純 swift 項目州叠,你繼續(xù)使用ReactiveCocoa 棵红。但是 RAC 依賴于 ReactiveSwift ,等于你引入了兩個庫咧栗。
如果你的項目是 swift 和 OC 混編逆甜,你需要同時引用 ReactiveCocoa 和 ReactiveObjCBridge 。但是 ReactiveObjCBridge 依賴于 ReactiveObjC 致板,所以你就等于引入了 4 個庫交煞。


ReactiveCocoa 試圖解決什么問題

  1. 傳統(tǒng) iOS 開發(fā)過程中,狀態(tài)以及狀態(tài)之間依賴過多的問題
  2. 傳統(tǒng) MVC 架構的問題:Controller 比較復雜斟或,可測試性差
  3. 提供統(tǒng)一的消息傳遞機制

傳統(tǒng) iOS 開發(fā)過程中素征,狀態(tài)以及狀態(tài)之間依賴過多的問題

我們在開發(fā) iOS 應用時,一個界面元素的狀態(tài)很可能受多個其它界面元素或后臺狀態(tài)的影響萝挤。
例如御毅,在用戶帳戶的登錄界面,通常會有 2 個輸入框(分別輸入帳號和密碼)和一個登錄按鈕怜珍。如果我們要加入一個限制條件:當用戶輸入完帳號和密碼端蛆,并且登錄的網絡請求還未發(fā)出時,確定按鈕才可以點擊酥泛。通常情況下今豆,我們需要監(jiān)聽這兩個輸入框的狀態(tài)變化以及登錄的網絡請求狀態(tài),然后修改另一個控件的enabled狀態(tài)柔袁。
RAC 通過引入信號(Signal)的概念呆躲,來代替?zhèn)鹘y(tǒng) iOS 開發(fā)中對于控件狀態(tài)變化檢查的代理(delegate)模式或 target-action 模式。因為 RAC 的信號是可以組合(combine)的捶索,所以可以輕松地構造出另一個新的信號出來插掂,然后將按鈕的enabled狀態(tài)與新的信號綁定。

RAC(self.loginBtn,enabled) = [RACSignal combineLatest:@[self.nameTF.rac_textSignal,
                                                        self.passwordTF.rac_textSignal
                                                        ]
                                                reduce:^(NSString *nameSignal,NSString *pwdSignal){
                                                            return @(nameSignal.length>=0 && pwdSignal.length>=0);
                                                        }];

簡單的解釋一下代碼:
這是將loginBtn的enable屬性和帳號和密碼兩個輸入框綁定,當兩個輸入框的文本都不為空的時候,loginBtn才可以點擊. 注意一點,reduce后面的block并不會自動生成所有的返回值,需要根據(jù)自己在前面綁定的幾個信號自己補全,然后直到這部分代碼完全寫完中間可能一直在報錯,不要理他.從RAC的源碼中可以看出來,前面綁定的信號不同后面的block返回值類型也是不同的.

統(tǒng)一消息傳遞機制

iOS 開發(fā)中有著各種消息傳遞機制,包括 KVO辅甥、Notification箩祥、delegation、block 以及 target-action 方式肆氓。各種消息傳遞機制使得開發(fā)者在做具體選擇時感到困惑. 在引入 RAC 之后,以前散落在action-target或 KVO 的回調函數(shù)中的判斷邏輯被統(tǒng)一到了一起.

// KVO
[RACObserve(self, username) subscribeNext:^(id x) {
    NSLog(@" 成員變量 username 被修改成了:%@", x);
}];
// target-action
self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    NSLog(@" 按鈕被點擊 ");
    return [RACSignal empty];
}];
// Notification
[[[NSNotificationCenter defaultCenter] 
    rac_addObserverForName:UIKeyboardDidChangeFrameNotification         
                    object:nil] 
    subscribeNext:^(id x) {
        NSLog(@" 鍵盤 Frame 改變 ");
    }
];
// Delegate
[[self rac_signalForSelector:@selector(viewWillAppear:)] subscribeNext:^(id x) {
    debugLog(@"viewWillAppear 方法被調用 %@", x);
}];

基礎用法理解參考下面這篇文章吧,是翻譯過來的,寫得很棒,例子層層深入,慢慢讀,就理解RAC的signal了.不過個人感覺想要深入了解,還是得自己多用.
ReactiveCocoa入門教程——第一部

試圖解決 MVC 框架的問題

對于傳統(tǒng)的 Model-View-Controller 的框架底瓣,Controller 很容易變得比較龐大和復雜谢揪。由于 Controller 承擔了 Model 和 View 之間的橋梁作用,所以 Controller 常常與對應的 View 和 Model 的耦合度非常高捐凭,這同時也造成對其做單元測試非常不容易拨扶,對 iOS 工程的單元測試大多都只在一些工具類或與界面無關的邏輯類中進行。
RAC 的信號機制很容易將某一個 Model 變量的變化與界面關聯(lián)茁肠,所以非常容易應用 Model-View-ViewModel 框架患民。通過引入 ViewModel 層,然后用 RAC 將 ViewModel 與 View 關聯(lián)垦梆,View 層的變化可以直接響應 ViewModel 層的變化匹颤,這使得 Controller 變得更加簡單,由于 View 不再與 Model 綁定托猩,也增加了 View 的可重用性印蓖。

MVVM 的作用和問題
MVVM 在實際使用中,確實能夠使得 Model 層和 View 層解耦京腥,但是如果你需要實現(xiàn) MVVM 中的雙向綁定的話赦肃,那么通常就需要引入更多復雜的框架來實現(xiàn)了。
對此公浪,MVVM 的作者 John Gossman 的 批評 應該是最為中肯的他宛。John Gossman 對 MVVM 的批評主要有兩點:

第一點:數(shù)據(jù)綁定使得 Bug 很難被調試。你看到界面異常了欠气,有可能是你 View 的代碼有 Bug厅各,也可能是 Model 的代碼有問題。數(shù)據(jù)綁定使得一個位置的 Bug 被快速傳遞到別的位置晃琳,要定位原始出問題的地方就變得不那么容易了讯检。
第二點:對于過大的項目,數(shù)據(jù)綁定需要花費更多的內存卫旱。

附:
之前在上家公司用過一個MBMvc的框架來幫助分層,很好用,不過我看了一下github上已經很久沒有更新了,懷疑是不是有什么問題停更了呢, 大家有興趣的可以了解一下這個框架.


摘自:
唐巧 : ReactiveCocoa - iOS開發(fā)的新框架

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末人灼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顾翼,更是在濱河造成了極大的恐慌投放,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件适贸,死亡現(xiàn)場離奇詭異灸芳,居然都是意外死亡涝桅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門烙样,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冯遂,“玉大人,你說我怎么就攤上這事谒获「蚣。” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵批狱,是天一觀的道長裸准。 經常有香客問我,道長赔硫,這世上最難降的妖魔是什么炒俱? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮爪膊,結果婚禮上权悟,老公的妹妹穿的比我還像新娘。我一直安慰自己推盛,他們只是感情好僵芹,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著小槐,像睡著了一般拇派。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凿跳,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天件豌,我揣著相機與錄音,去河邊找鬼控嗜。 笑死茧彤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的疆栏。 我是一名探鬼主播曾掂,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壁顶!你這毒婦竟也來了珠洗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤若专,失蹤者是張志新(化名)和其女友劉穎许蓖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡膊爪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年自阱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米酬。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡沛豌,死狀恐怖,靈堂內的尸體忽然破棺而出赃额,到底是詐尸還是另有隱情琼懊,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布爬早,位于F島的核電站,受9級特大地震影響启妹,放射性物質發(fā)生泄漏筛严。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一饶米、第九天 我趴在偏房一處隱蔽的房頂上張望桨啃。 院中可真熱鬧,春花似錦檬输、人聲如沸照瘾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽析命。三九已至,卻和暖如春逃默,著一層夾襖步出監(jiān)牢的瞬間鹃愤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工完域, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留软吐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓吟税,卻偏偏與公主長得像凹耙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肠仪,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容