Swift上的MVVM實踐 ---PARSMVVMToolkit

PARSMVVMToolkit

https://github.com/PA-RS/PARSMVVMToolkit

PARSMVVMToolkit 是一款在Swift 實踐 MVVM 設計模式的Framework炼七。這款Framework提供了更便利的API使視圖業(yè)務邏輯分層更加清晰


介紹

M-V-VM.png
view :由 MVC 中的 view 和 controller 組成征绎,負責 UI 的展示拆火,綁定 viewModel 中的屬性,觸發(fā) viewModel 中的命令磷籍;
viewModel :從 MVC 的 controller 中抽取出來的展示邏輯获三,負責從 model 中獲取 view 所需的數(shù)據(jù)啡专,轉(zhuǎn)換成 view 可以展示的數(shù)據(jù)冲杀,并暴露公開的屬性和命令供 view 進行綁定怜俐;
model :與 MVC 中的 model 一致身堡,包括數(shù)據(jù)模型、訪問數(shù)據(jù)庫的操作和網(wǎng)絡請求等拍鲤;
binder :在 MVVM 中盾沫,聲明式的數(shù)據(jù)和命令綁定是一個隱含的約定,它可以讓開發(fā)者非常方便地實現(xiàn) view 和 viewModel 的同步殿漠,避免編寫大量繁雜的樣板化代碼赴精。在微軟的 MVVM 實現(xiàn)中,使用的是一種被稱為 XAML 的標記語言绞幌。
PARSMVVMToolkit結(jié)合Swift語言的特性實踐了MVVM架構(gòu)模式蕾哟,提供了更好分層與Binding方式。
PARSMVVMToolkit.png

(*)標星號的是暫未實現(xiàn)的功能

PARSMVVMToolkit提供了:

DataContextExtension

可以在ViewController 中指定數(shù)據(jù)上下文

override func viewDidLoad() {
    let vm: MainViewModel = PARSMVVMToolkitExampleFactory.defaultFactory.getViewModel()
    self.dataContext = vm
}
    

子ViewController 會共享該上下文莲蜘,你可以在ViewController 中這么做來判定自己的上下文

guard let viewModel: MainViewModel = self.dataContext as? MainViewModel
            else {
                return false
        }

通過數(shù)據(jù)上下文將業(yè)務邏輯與視圖隔離

NavigationService & DialogService

ViewModel-Based Navigation 讓頁面跳轉(zhuǎn)在ViewModel中變?yōu)檫壿媽蛱啡罚辉谛枰P(guān)注跳轉(zhuǎn)視圖動畫,更加優(yōu)雅的編寫視圖邏輯層

public class MainViewModel: PARSViewModelBase {

    required public init() {
        super.init()
        self.toWikipediaCommand = RACCommand(signalBlock: { input in
            return RACSignal.createSignal({ [weak self] subscriber in
                let vm: WikipediaSearchViewModel = PARSMVVMToolkitExampleFactory.defaultFactory.getViewModel()
                self?.navigationService.navigationToViewModel(vm, animated: true)
                subscriber.sendCompleted()
                return nil
                })
        })
    }
   
    public var toWikipediaCommand: RACCommand?
    
    public override func loadState() {
       
    }
    
}

為什么要使用ViewModel-Based 導航票渠?

我們先來思考一個問題逐哈,就是我們?yōu)槭裁匆獙崿F(xiàn) ViewModel-Based 的導航操作呢?直接在 view 層使用系統(tǒng)的 push/present 等操作來完成導航不就好了么问顷?我總結(jié)了一下這么做的理由昂秃,主要有以下三點:

從理論上來說,MVVM 模式的應用應該是以 viewModel 為驅(qū)動來運轉(zhuǎn)的杜窄;
根據(jù)我們前面對 MVVM 的探討肠骆,viewModel 提供了 view 所需的數(shù)據(jù)和命令。因此塞耕,我們往往可以直接在命令執(zhí)行成功后使用 doNext 順帶就把導航操作給做了蚀腿,一氣呵成;
這樣可以使 view 更加輕量級扫外,只需要綁定 viewModel 提供的數(shù)據(jù)和命令即可莉钙。
既然如此,那我們究竟要如何實現(xiàn) ViewModel-Based 的導航操作呢筛谚?我們都知道 iOS 中的導航操作無外乎兩種磁玉,push/pop 和 present/dismiss ,前者是 UINavigationController 特有的功能刻获,而后者是所有 UIViewController 都具備的功能蜀涨。注意瞎嬉,UINavigationController 也是 UIViewController 的子類,所以它也同樣具備 present/dismiss 的功能厚柳。因此氧枣,從本質(zhì)上來說,不管我們要實現(xiàn)什么樣的導航操作别垮,最終都是離不開 push/pop 和 present/dismiss 的便监。

目前,PARSMVVMToolkit 的做法是在 view 層維護一個 NavigationController 的堆棧 NavigationControllerStack 碳想,不管是 push/pop 還是 present/dismiss 烧董,都使用棧頂?shù)?NavigationController 來執(zhí)行導航操作,并且保證 present 出來的是一個 NavigationController

-- 以上引用 http://blog.leichunfeng.com/blog/2016/02/27/mvvm-with-reactivecocoa/

DialogService 則提供了一種方便邏輯層使用的Alert 消息的方式胧奔,使邏輯層不必關(guān)注消息彈窗以及錯誤提示的樣式和方法

ViewModelBase

ViewModel基類逊移,提供了NavigationService & DialogService的注入 以及ViewModel的生命周期

Binder

我們通過協(xié)議擴展了Binder方法,當UIViewController 或者 UIView 設定了DataContext后 會適當?shù)挠|發(fā)Bind 或 UnBind 操作 龙填,更加便利從容將我們需要的數(shù)據(jù)Binding到UI上

protocol PARSBinderProtocol {
    /**
     binding
     
     - returns: return Success or Failed
     */
    optional func bind() -> Bool
    
    /**
     unBinding
     
     - returns: return Success or Failed
     */
    optional func unBind() -> Bool
}
extension WikipediaSearchCell {
    
    override public func bind() -> Bool {
        guard let item: WikipediaSearchResultItem = self.dataContext as? WikipediaSearchResultItem else {
            return false
        }
        self.titleOutlet.text = item.result?.title
        self.URLOutlet.text = item.result?.URL.absoluteString
        
        return true
    }
    
    override public func unBind() -> Bool {
        
        return true
    }
}

樣例

查看并運行 PARSMVVMToolkitExample/PARSMVVMToolkitExample.xcodeproj

如何使用

PARSMVVMToolkit 支持 OS X 10.9+, iOS 8.0+

使用PARSMVVMToolkit:

將PARSMVVMToolkit作為一個子模塊加入到你的程序中

將PARSMVVMToolkit.framework 加入到Embedded Binaries 選項卡中

在Build setting 中將EMBEDDED_CONTENT_CONTAINS_SWIFT build setting 設置為YES

參考

https://github.com/leichunfeng/MVVMReactiveCocoa

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胳泉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岩遗,更是在濱河造成了極大的恐慌扇商,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宿礁,死亡現(xiàn)場離奇詭異案铺,居然都是意外死亡,警方通過查閱死者的電腦和手機梆靖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門控汉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涤姊,你說我怎么就攤上這事暇番∴头牛” “怎么了思喊?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長次酌。 經(jīng)常有香客問我恨课,道長,這世上最難降的妖魔是什么岳服? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任剂公,我火速辦了婚禮,結(jié)果婚禮上吊宋,老公的妹妹穿的比我還像新娘纲辽。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布拖吼。 她就那樣靜靜地躺著鳞上,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吊档。 梳的紋絲不亂的頭發(fā)上篙议,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音怠硼,去河邊找鬼鬼贱。 笑死,一個胖子當著我的面吹牛香璃,可吹牛的內(nèi)容都是我干的这难。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼葡秒,長吁一口氣:“原來是場噩夢啊……” “哼雁佳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起同云,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤糖权,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炸站,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體星澳,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年旱易,在試婚紗的時候發(fā)現(xiàn)自己被綠了禁偎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡阀坏,死狀恐怖如暖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忌堂,我是刑警寧澤盒至,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站士修,受9級特大地震影響枷遂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棋嘲,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一酒唉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沸移,春花似錦痪伦、人聲如沸侄榴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牲蜀。三九已至,卻和暖如春绅这,著一層夾襖步出監(jiān)牢的瞬間涣达,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工证薇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留度苔,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓浑度,卻偏偏與公主長得像寇窑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子箩张,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容