面試問題之四:MVC模式


Model:模型保存應(yīng)用程序的數(shù)據(jù)。

View:視圖是模型的可視化表示以及用戶交互的控件;

Controller:控制器是一個協(xié)調(diào)所有工作的中介者(Mediator)。它訪問模型中的數(shù)據(jù)并在視圖中展示它們,同時它們還監(jiān)聽事件和根據(jù)需要操作數(shù)據(jù)。

MVC 約定, Model 不允許與View 打交道。 Model 是管理數(shù)據(jù)的, 當Model中的數(shù)據(jù)發(fā)生變化時,與之對應(yīng)的視圖應(yīng)更新。 這就需要一種機制來支持。為此 iOS 框架提供了兩種支持機制: Notification 和KVO (Key-Value Observing)。 KVO 可簡單理解為,為你所關(guān)注的 Key 對象注冊一個監(jiān)聽器。 當有數(shù)據(jù)發(fā)生變化時,就會發(fā)出廣播給所有的監(jiān)聽器。

MVC 也約定, View 不允許直接引用Modal, 它只能被Controller 所控制。 Controller 控制 View 顯示什么數(shù)據(jù)。我們知道,View 所要顯示的數(shù)據(jù)是來源于 Modal, View 上產(chǎn)生的事件 ( 比如 Touch事件)需要通知 Controller。 既然MVC 不允許直接打交道,就需要提供一種機制: Delegate

我們看View 是怎么向 Controller 通信的。對于這個,? iOS 有三種常見的模式:

1,設(shè)置View對應(yīng)的Action Target。如設(shè)置UIButton的Touch up inside的Action Target。

2,設(shè)置View的Delegate,如UIAlertViewDelegate, UIActionSheetDelegate,UITextFieldDelegate等。

3,設(shè)置View的data source, 如UITableViewDataSource。

通過以上三種模式,View既能向Controller通信,又無需知道具體的Controller是誰,這樣,View 就與Controller解耦了。

除此之外, iOS 還提供了 Action-Target 模式來讓Controller 監(jiān)聽View 觸發(fā)的事件。 View 又是如何獲取數(shù)據(jù)呢? iOS提供了 Data source 的概念,其實也就是Protocol 的應(yīng)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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