2011-05-30 63 views
6

例如,我有一個模型類來處理從其他iPhone接收藍牙消息。當我收到其中一條消息時,我需要更新一個視圖。我相信這樣做的標準方式是通過視圖控制器。視圖控制器具有對模型和視圖的引用,因此可以與每個人交流。模型與視圖控制器進行通信的建議方式是什麼?

然而,他們應該如何發送消息回VC?他們可以分別引用視圖控制器(作爲一個屬性,賦值不保留)。那是不好的做法(如果我沒有把它當作循環參考)?
是否有替代方法做到這一點?我已經考慮了委託模式,但是要編寫一個完整的委託,對於一個簡單的問題,所有這些工作似乎都是相當多的工作。 或者,如果您認爲我正在過度咀嚼,請隨時告訴我!

[我認爲這個問題可能已經到來之前,它似乎很常見,但我搜索了一下,並沒有發現多少]

感謝您的幫助,

+0

您可以將委託添加到您的模型並使其指向VC。 – Shirkrin 2011-05-30 09:28:14

+1

您也可以使用本地通知中心發佈通知,然後使用VC收聽這些通知。 – Shirkrin 2011-05-30 09:28:46

+0

我會考慮使用NSNotificationCenter,謝謝。你的意思是創建我自己的而不是使用默認的(由singleton方法defaultCenter返回的)? – 2011-05-30 09:37:15

回答

6

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

  1. 代表團
  2. 志願(鍵 - 值觀察)
  3. 通知

如果你的模型只需要通知一個對象(你視圖控制器)的變化,委派是要走的路。它可能會感覺像創建一個新接口,將模型中的委託屬性等添加到工作中,但在靈活性,代碼重用,設計等方面絕對值得。委託是Cocoa編程中的一種標準模式,並且廣泛用於Apple的API中。

如果您的模型需要通知多個對象發生變化,您需要使用KVO或通知。使用KVO,您可以訂閱更改模型上特定財產或密鑰的事件。例如,當模型上的「消息」屬性發生更改時,可以將任何附加的偵聽器通知更改並作出相應響應。

當您要將應用程序範圍的消息發送給多個偵聽器時,會使用通知。標準API的示例是鍵盤通知(當鍵盤顯示/解除時)以及界面方向更改。

所以在你的情況下,代表團或KVO可能是最好的選擇。

+0

哇,感謝那些信息。我真的從來沒有聽說過KVO,但現在我會再看看它;這可能正是我需要的!謝謝。 – 2011-05-30 10:48:49

0

中從來沒有這麼做過一個iOS應用程序,但通常是mvc術語,有時它會更好理解(並保持代碼更清晰),以便直接從模型更新視圖。我認爲這很好,但它將模型與觀點相結合,這很糟糕。因此,爲了解決這個問題,您應該實現觀察者(廣播 - 接收)設計模式(或使用內置的ios事件廣播/接收系統 - > NSNotificationCenter)。這樣,當發生改變模型的事情發生時,模型會播出一個均勻的聲音,無論是否有人傾聽該事件,這不再是它的問題,因此,您將視圖從模型中分離出來。

相關問題