簡體   English   中英

model 與視圖 controller 通信的推薦方式是什么?

[英]What is the recommended way for a model to communicate with a view controller?

例如,我有一個 model class 處理從其他 iPhone 接收藍牙消息。 當我收到其中一條消息時,我需要更新視圖。 我相信這樣做的標准方法是通過視圖 controller。 視圖 controller 引用了 model 和視圖,因此可以與它們中的每一個進行通信。

但是他們應該如何將消息發送回 VC? 他們可以參考 controller 每個視圖(作為屬性,分配不保留)。 這是不好的做法(如果我沒記錯它是循環引用)?
有沒有其他方法可以做到這一點? 我已經考慮過委托模式,但是要編寫一個完整的委托,對於一個簡單的問題來說似乎需要做很多工作。 或者,如果您認為我想太多了,請隨時告訴我!

【我覺得這個問題之前大概也出現過,好像挺常見的,但是我搜索了一下,沒找到太多】

謝謝你的幫助,

一般來說,您有 3 種不同的技術:

  1. 代表團
  2. KVO(鍵值觀察)
  3. 通知

如果您的 model 只需要通知一個 object(您的視圖控制器)更改,則委托是 go 的方式。 創建新接口、將委托屬性添加到 model 等可能感覺像是額外的工作,但在靈活性、代碼重用、設計等方面絕對值得。委托是 Cocoa 編程中的標准模式,並且是在 Apple 的 API 中廣泛使用。

如果您的 model 需要通知多個對象更改,您想使用 KVO 或通知。 使用 KVO,您可以訂閱 model 上特定屬性或鍵的更改事件。 例如,當 model 上的“消息”屬性發生更改時,任何附加的偵聽器都可以收到更改通知並做出相應的響應。

當您想要將應用程序范圍的消息發送到多個偵聽器時,將使用通知。 標准 API 的示例是鍵盤通知(當鍵盤顯示/關閉時)和界面方向更改。

因此,在您的情況下,委托或 KVO 可能是最佳選擇。

在 iOS 應用程序中從未這樣做過,但在一般 mvc 術語中,有時直接從 model 更新視圖更有意義(並保持代碼更清晰)是的。 在我看來這很好,但是它將 model 與視圖耦合在一起,這很糟糕。 因此,要解決這個問題,您應該實現一個觀察者(廣播接收)設計模式(或使用內置的 ios 事件廣播器/接收器系統 -> NSNotificationCenter)。 這樣,當發生改變 model 的事情時,model 將廣播一個偶數,無論是否有人收聽該事件,這不再是它的問題了,因此,您將視圖與 Z20F35E630DAF44D88C3F6 分離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM