iOS的MVC設計模式和MVVM的異同點以及iOS中如何實現數據綁定

設計模式:MVC

在模型對象(model)中封裝數據和基本行爲
  • 模型對象維護應用程序的數據,並定義操作數據的特定邏輯。
  • 只要是加載的是包含有應用程序永久信息的數據,就將其放到model中。
  • 理想狀況下,模型對象同用於對其進行顯示和編輯的用戶界面之間不應該有任何直接的關聯。
使用視圖對象(view)
  • 視圖對象可以響應用戶操作,並懂得如何將自己展現在屏幕上。
  • 視圖對象通常從應用程序的模型對象獲取數據用以展示,用戶可以通過視圖來修改模型對象的數據。
  • 視圖對象和模型對象雖然之間關係密切但不沒有耦合,除非因爲性能原因(比如視圖需要對數據進行緩存),否則不應該將視圖用於存儲其所展示的數據。
控制器對象(Controller)聯繫起模型和視圖
  • 協調視圖對象和模型對象,使視圖得以知曉模型的變更而給予響應。
  • 還可以爲應用程序執行其他操作,比如爲應用程序管理其他對象的生命週期,進行設置和協調任務。
作爲複合設計模式的MVC:

Cocoa的MVC用到的模式有:組合(Composite)、命令(Command)、中介者(Mediator)、策略(Strategy)和觀察者(Observer)

  • 組合:視圖對象之間以協作的方式構成一個視圖層次體系,其中既可以有複合視圖(如表格視圖),也可以有獨立視圖(如文本框)。每個層次的視圖節點都可以響應用戶操作並把自己繪製到屏幕上。
  • 命令:“目標-動作”機制,視圖對象可以推遲其他對象(比如控制器的執行)的執行,讓其他對象發生了某些事件後執行。這是命令模式。
  • 中介者:控制器對象起着中間人的作用,而這個中間人則採用了中介者模式,構成了視圖和模型對象間傳遞數據的雙向渠道。控制器對象將模型的變更傳遞給視圖對象。
  • 策略:控制器可以是視圖對象的一個 “策略”。視圖對象將自身隔離,以期維持其作爲數據展示器的唯一職責,而將一切應用程序特有的界面行爲決定委託給它的“策略”對象。
  • 觀察者:模型對象向它所關注的控制器等對象發出內部狀態變化的通知。

在這裏插入圖片描述

  • 三者之間的通信只能實現Controller和Model以及Controller和View之間的通信,兩者作爲Controller的屬性。堅決不能有Model和View之間的通信,否則失去了分離的意義。
  • 正常情況下是Controller控制View和Model,但View和Model也可以實現對Controller的反向通信。
  • View通過以下三種方式實現與Controller的通信
  1. action-target:用戶與UI交互觸發控制器。例如點擊按鈕實現頁面跳轉,網絡請求。
  2. delegate:View向Controller詢問自己無法決定的事情或讓Controller幫助自己做一些無法獨立完成的事情。例如表格視圖詢問Controller自己是否可以滾動,如果Model數據量很少,Controller告訴表格不可以滾動;若還有未拉出的數據,則Controller告知可以滾動。
  3. dataSource:視圖讓控制器給它將要顯示的數據。(Controller從Model中獲取數據)
  • Model通過以下兩種方式實現與Controller的通信:
  1. Notification:控制器註冊監聽某模型數據變化的廣播頻道,當此模型數據變化後向該控制器發送廣播,告知模型變化情況。
  2. KVO機制:模型作爲控制器的屬性,當模型屬性被修改後,持有此模型屬性的控制器就會收到通知。
  • 多個MVC的結合,例如可以在標籤欄中設置多個標籤,每個標籤指針指向一個MVC。一個小的MVC可作爲一個大MVC的V。一個大的model可以有多個小的MVC。

MVVM

MVVM比起MVC最大的好處就是可以實現自動綁定,將數據綁定在UI組件上,當UI中的值發生變化時,那麼它對應的模型中也跟隨着發生變化,這就是雙向綁定機制,原因在於它在視圖層和數據模型層之間實現了一個綁定器,綁定器可以管理兩個值,它一直監聽組件UI的值,只要發生變化,它將會把值傳輸過去改變model中的值。綁定器比較靈活,還可以實現單向綁定。

  1. 實際開發中的做法:讓Controller擁有View和ViewModel屬性,VM擁有Model屬性;Controller或者View來接收ViewModel發送的Model改變的通知
  2. 用戶的操作點擊或者Controller的視圖生命週期裏面讓ViewModel去執行請求,請求完成後ViewModel將返回數據模型化並保存,從而更新了Model;Controller和View是屬於V部分,即實現V改變M(V綁定M)。如果不需要請求,這直接修改Model就是了。
  3. 第2步中的Model的改變,VM是知道的(因爲持有關係),只需要Model改變後發一個通知;Controller或View接收到通知後(一般是Controller先接收再賦值給View),根據這個新Model去改變視圖就完成了M改變V(M綁定V)
    使用RAC(RactiveCocoa)框架實現綁定可以簡單到一句話概括:ViewModel中創建好請求的信號RACSignal, Controller中訂閱這個信號,在ViewModel完成請求後訂閱者調用sendNext:方法,Controller裏面訂閱時寫的block就收到回調了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章