iOS開發中MVC、MVVM模式詳解

iOS中的MVC(Model-View-Controller)將軟件系統分爲Model、View、Controller三部分web

 

技術分享

 

Model: 你的應用本質上是什麼(但不是它的展現方式)app

Controller:你的Model怎樣展現給用戶(UI邏輯)ide

View:用戶看到的,被Controller操縱着的測試

 

Controller能夠直接訪問Model,也能夠直接控制View。.net

但Model和View不能互相通訊。server

 

View能夠經過action-target的方式訪問Controller,好比咱們在StoryBoard中拖UIButton到代碼中所建立的@IBAction ,當按鈕被點擊時,View就會傳遞該信息給Controller。對象

有時候Controller須要實時監控View的狀態,這時Controller會經過protocol將其自身設爲View的delegate,這樣當View will change、should change、did change 的時候Controller也會接到相應通知。開發

View不存儲數據,但View能夠經過協議獲取Controller而不是Model中的數據用來展現。get

Controller整理Model中的數據用於給View展現。io

 

Model不能直接與Controller通信,由於Model是獨立於UI存在的。

但當Model發生改變想通知Controller時可以使用廣播機制,在iOS中有NSNotification和KVO(Key-value observing)可供使用。

 

NSNotification:

 

        let center = NSNotificationCenter.defaultCenter()
        
        center.
addObserverForName(UIContentSizeCategoryDidChangeNotification,
            object: 
UIApplication.sharedApplication(),
            queue: 
NSOperationQueue.mainQueue())
            { notification 
in
                let c = notification.userInfo?[UIContentSizeCategoryNewValueKey]

        }

 

UIContentSizeCategoryDidChangeNotification以及UIContentSizeCategoryNewValueKey均爲系統中定義好的String

 

KVO:

 

在ViewDidLoad中:

     webView.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil)

 

     override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [NSObject : AnyObject]?, context: UnsafeMutablePointer<Void>) {

             if (keyPath == "estimatedProgress") {

                 progressView.hidden = webView.estimatedProgress == 1

                 progressView.setProgress(Float(webView.estimatedProgress), animated: true)

             }

         }

 

MVP模式從經典的MVC模式演變而來,將Controller替換成Presenter,依據MVP百度百科中的解釋,MVP的優勢相比較於MVC是徹底分離Model與View,Model與View的信息傳遞只能經過Controller/Presenter,我查閱資料發如今其餘平臺上的MVC模式View與Model可否直接通信有着不一樣的說法,但在iOS開發中,Apple是這麼說的。在MVC下,全部的對象被歸類爲一個model,一個view,或一個controller。Model持有數據,View顯示與用戶交互的界面,而View Controller調解Model和View之間的交互,在iOS開發中我按照Model與View沒法相互通信來理解。

 

MVVM(Model View View-Model)

 

技術分享

 

上圖展現了MVVM與MVC的差異。

 

在MVC模式的iOS開發中,Controller承擔了太多的代碼,包含着咱們的視圖處理邏輯和業務邏輯。

 

技術分享

 

在MVVM中,咱們將視圖處理邏輯從C中剝離出來給V,剩下的業務邏輯部分被稱作View-Model。

使用MVVM模式的iOS應用的可測試性要好於MVC,由於ViewModel中並不包含對View的更新,相比於MVC,減輕了Controller的負擔,使功能劃分更加合理。

 

MVVM模式的正確實踐是,咱們應該爲app delegate的根視圖建立一個ViewModel,當咱們要生成或展現另外一個次級ViewController時,採用當前的ViewModel爲其建立一個子ViewModel。

技術分享

而這些ViewModel的代碼並不放在ViewController中,咱們的View請求本身的ViewModel來獲取所需的數據,ViewController徹底歸於View。

相關文章
相關標籤/搜索