關(guān)于RxSwift的簡要分析
大小:0.4 MB 人氣: 2017-10-12 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
標(biāo)簽:rxswift(1727)
去年整整一年,我都在試圖理解響應(yīng)式編程的原理是什么,并且試圖驗(yàn)證如果在我的App中使用這種編程范式是否會(huì)帶來好處。于是,我查詢了許多相關(guān)的解決方案,從 ReactiveCocoa& Objective-C 開始,及其 Swift 版本 ReactiveCocoa with Swift,再到我朋友實(shí)現(xiàn)的一個(gè)輕量級(jí)的框架 VinceRP。上述這些都是令人贊嘆不已的項(xiàng)目,ReactiveCocoa 的項(xiàng)目成熟度非常高,但是十分復(fù)雜;而VinceRP的實(shí)現(xiàn)非常容易,所以理解起來非常簡單。在學(xué)習(xí)的過程中,我寫了一系列關(guān)于我學(xué)習(xí)響應(yīng)式編程的經(jīng)歷的文章,所以經(jīng)常會(huì)被讀者問到一些關(guān)于 RxSwift的問題。慚愧地說,我還從沒有使用RxSwift來編寫一個(gè)項(xiàng)目。實(shí)際上我還從來沒用過任何語言的 Rx框架,所以我一直認(rèn)為,對(duì)于那些曾在別的開發(fā)環(huán)境中有使用Rx經(jīng)歷的人來說,理解RxSwift是非常容易的。既然如此,我也是時(shí)候來嘗試一把了。
Rx
Rx是最常使用的一個(gè)響應(yīng)式編程框架。它與其他RP框架的一大不同是它的跨平臺(tái)特性,同時(shí),它有著最大的開源社區(qū),無數(shù)的文檔以及有參考價(jià)值的問題討論,許許多多的人不斷地對(duì)其進(jìn)行改進(jìn)。
Swift
這門語言在去年一年中飛速的成長,并且現(xiàn)在也進(jìn)行了開源了。一些像RxSwift之類的項(xiàng)目也隨著其一起成長。因此,現(xiàn)在已經(jīng)沒有什么理由可以再阻止你去使用Swift這項(xiàng)技術(shù)了。當(dāng)然,一些重大的改動(dòng)仍然被列在radar上,但它們很可能在短時(shí)間內(nèi)不會(huì)被解決,這就意味著這個(gè)項(xiàng)目會(huì)不斷地被改進(jìn),這不是很好嗎?
使用 RxSwift 開發(fā)一個(gè)App
如果你曾閱讀過我的博客,可能你現(xiàn)在會(huì)猜我使用RxSwift開發(fā)了一個(gè)App。沒錯(cuò),你是對(duì)的。這是個(gè)很耗時(shí)的習(xí)慣,但是我不喜歡依賴于一個(gè)理想的環(huán)境,所以通常我都會(huì)寫一個(gè)例子來讓我有那么一點(diǎn)感覺。通過這種方式,我可以很好理解如何讓框架為我工作,而不是我為它工作。這里我想說一點(diǎn)個(gè)人感受,對(duì)于解決問題來說,你所選用的框架只是萬千可用方案中的一種,因此,方案的選擇是因人而異的。而這些選擇所帶來的多樣性,正是我如此熱愛編程的一大原因。
我所寫的這個(gè)應(yīng)用名叫 iCopyPasta,是一個(gè)在去年Functional Swift Conf上展示的Mac剪貼板應(yīng)用 CopyPasta的iOS姐妹版。顯而易見,它們并不是一個(gè)完整的產(chǎn)品所以并不可以被用來上架。我現(xiàn)在每天都使用Mac版本的CopyPasta,但是我可能存在某些偏見。我的計(jì)劃是將來會(huì)發(fā)布Mac版本和iOS版本的CopyPasta應(yīng)用,并可能會(huì)將這兩個(gè)版本進(jìn)行打通。
難道這不是我一直以來的計(jì)劃嗎?
Observables
我首先對(duì) UIPasteboard開啟監(jiān)聽,這些監(jiān)聽會(huì)對(duì)你拷貝東西時(shí)出現(xiàn)在 UIPasteboard 中的字符串和圖像類型進(jìn)行觀測(cè)。
let pasteboard = NSNotificationCenter.defaultCenter().rx_notification(“UIPasteboardChangedNotification”, object: nil) _ = pasteboard.map { [weak self] (notification: NSNotification) -》 PasteboardItem? in if let pb = notification.object as? UIPasteboard { if let string = pb.valueForPasteboardType(kUTTypeUTF8PlainText as String) { return self?.pasteboardItem(string) } if let image = pb.valueForPasteboardType(kUTTypeImage as String) { return self?.pasteboardItem(image) } } return nil }
之前我的方法是直接對(duì)UIPasteboard中的字符串和圖像直接進(jìn)行觀察,但是這個(gè)方法是不穩(wěn)妥的。原因在于UIPasteboard可能不是一個(gè)KVO安全的類型(具體請(qǐng)看下方的評(píng)論)。參考別人的建議后,我使用RxSwift另一個(gè)非常棒的特性rx_notification來監(jiān)聽UIPasteboardChangedNotification
.subscribeNext { [weak self] pasteboardItem in if let item = pasteboardItem { self?.addPasteboardItem(item) } }
這里的pasteboard是一個(gè)Observable《NSNotification》,這也是為什么可以很容易得訂閱其.Next事件同時(shí)相應(yīng)地去更新tableView。而map則是從監(jiān)聽到的通知所涉及的對(duì)象中獲取字符串或者圖像,并將獲取到的結(jié)果轉(zhuǎn)換成PasteboardItem。
Dispose bags
訂閱信號(hào)會(huì)產(chǎn)生Disposable。如果不終止訂閱,那么這些生成的Disposable將會(huì)一直存在,這無疑是非常耗內(nèi)存的。所以,你要么對(duì)這些訂閱調(diào)用dispose,要么你可以像我一樣,使用dispose bags來自動(dòng)銷毀相關(guān)的訂閱。
.addDisposableTo(disposeBag)
UIKit/Appkit bindings
你可以很容易地通過rx_itemsWithCellIdentifier將Observable序列綁定到table view上。element來自于我定義的PasteboardItem枚舉類型,這也是為什么我會(huì)采用Switch來處理這個(gè)對(duì)象,這樣可以根據(jù)其具體的枚舉值來顯示不同的樣式。
pasteViewModel.pasteboardItems() .bindTo(tableView.rx_itemsWithCellIdentifier(“pasteCell”, cellType: UITableViewCell.self)) { (row, element, cell) in switch element { case .Text(let string): cell.textLabel?.text = String(string) case .Image(let image): cell.imageView?.image = image }.addDisposableTo(disposeBag)
另外一個(gè)很棒的補(bǔ)充是rx_modelSelected。你可以通過它來獲取你觸發(fā)選擇事件時(shí)對(duì)應(yīng)的element。簡單來說,它是一個(gè)對(duì)tableView:didSelectRowAtIndexPath:的封裝,可以將代碼變得非常簡潔。
tableView .rx_modelSelected(PasteboardItem) .subscribeNext { [weak self] element in self?.pasteViewModel.addItemsToPasteboard(element) }.addDisposableTo(disposeBag)
你可以通過如下鏈接來查看所以關(guān)于 UIKit/AppKit(RxCocoa)的擴(kuò)展RxSwift’s GitHub。
總體感受
到目前為止,我還只是探索了 RxSwift 能力的一小部分,但是我已經(jīng)感受到 RxSwift 是一個(gè)非常棒的框架。如果能夠更深入理解它的機(jī)制并學(xué)會(huì)基于它的設(shè)計(jì)思路進(jìn)行思考,那肯定會(huì)更好。
我非常喜歡一些像 Rx.playground,RxMarbles這樣的資料及 great community這樣的社區(qū)。這些資料給了我很多的靈感,所以我也樂于將我的學(xué)習(xí)經(jīng)驗(yàn)分享給 bitrise.io的用戶。還有一些比較重要的內(nèi)容,比如schedulers還未被涉及,但是絕對(duì)值得研究一番。
對(duì)我來說,我還需要一段時(shí)間來更好地理解 Rx。與我嘗試 ReactiveCocoa 只有個(gè)把小時(shí)不同,我現(xiàn)在可以每天都在工作中使用 RxSwift,并且堅(jiān)持使用超過了一年。這都得感謝在 Prezi 的伙伴們。
作為一個(gè)曾經(jīng)學(xué)習(xí)過 ReactiveCocoa 的人來說,我現(xiàn)在更傾向于使用 RxSwift,可能是因?yàn)槲椰F(xiàn)在自認(rèn)為已經(jīng)對(duì)于 RxSwift 已經(jīng)足夠了解,并且使用它可以很快得完成我的編碼任務(wù)。當(dāng)然,在將來我可能會(huì)同時(shí)使用兩者,但是我認(rèn)為對(duì)于兩者之間任一框架的熟練使用不代表會(huì)在學(xué)習(xí)另外一個(gè)框架的時(shí)候給你帶來很大的優(yōu)勢(shì)。它們?cè)趲讉€(gè)方面有著不同。同時(shí),這兩個(gè)框架(概括來說應(yīng)該是所有的響應(yīng)式編程框架)都有著陡峭的學(xué)習(xí)曲線。對(duì)于我來說,我已經(jīng)度過了學(xué)習(xí) ReactiveCocoa 最難的那段時(shí)光,但如果你是一個(gè)初學(xué)者,我建議你自己動(dòng)手嘗試這兩種框架,甚至更多。
深入閱讀
如果你還在思考應(yīng)該使用哪個(gè)響應(yīng)式編程的框架,那么我建議你去讀一讀 Ash Furrow 所寫的關(guān)于如何挑選響應(yīng)式編程框架的文章。
你也可以看看其他一些在 iOS 中使用響應(yīng)式編程的視頻及文章,這些內(nèi)容都非常得棒,相信你會(huì)受益匪淺。
?
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%