2017-06-18 99 views
6

我是開發新手,最近正在實踐MVVM設計模式。要在ViewModel &控制器之間進行通信,我正在使用Closure。我知道我也可以使用委託。但是有沒有什麼傳統或理由,我應該遵循什麼特別的方式來進行溝通。我有點困惑。任何幫助將不勝感激。ViewModel和Controller之間進行通信的最佳方式

+0

溝通在這種情況下意味着變量交換? –

+0

是的。我在ViewModel類中準備DataArray,它將被髮送到控制器來提供我的TableView。 – MarkMe

回答

7

我也尋找這個答案,我發現這一點,

業務邏輯層(BLL)將打破關注分離(SOC)。您正在準備的數據駐留在BLL中,所以基本上你會說「嘿BLL爲我執行這個UIL邏輯」。這是一個SOC。 (在此處查找更多https://en.wikipedia.org/wiki/Separation_of_concerns。)

BLL應僅通過委託通知與UIL進行通信。 BLL基本上這樣說:「嘿UIL,我完成了我的邏輯,這裏有一些數據參數,你可以用它來操作UI控件。」

所以UIL不應該要求BLL爲他執行UI控制邏輯。只應要求BLL通知他。

這是鏈接,您將看到更清晰的視圖。

Usage of MVVM in iOS

+0

感謝您的時間和鏈接。 – MarkMe

0

您有很多選擇,具體取決於您的應用程序的結構。一個是使用單身人士。我更喜歡這種方法不是太複雜的應用程序。位於單例類中的數據處理(存儲,結構化)。訪問這個單例類的數據的不同視圖。例如,你有一個名爲DataManager的單例或類似的東西。不同的控制器和其他簡單結構從這個單例中訪問所需的數據。

這裏是例如一個非常簡單的操場代碼:傳遞從UI層(UIL)的封閉

class DataManager 
{ 
    static let sharedInstance = DataManager() 

    var _value: Int = 0 
    var value: Int 
    { 
     get 
     { 
      return _value 
     } 
     set 
     { 
      _value = newValue 
     } 
    } 
} 

class DemoController1 
{ 
    let dm = DataManager.sharedInstance 

    func incValue() 
    { 
     dm.value += 1 
    } 
} 

class DemoController2 
{ 
    let dm = DataManager.sharedInstance 

    func mulValue() 
    { 
     dm.value *= 2 
    } 
} 

let dm = DataManager.sharedInstance 
let dc1 = DemoController1() 
let dc2 = DemoController2() 

print ("value: \(dm.value)") 
dc1.incValue() 
print ("value: \(dm.value)") 
dc1.incValue() 
print ("value: \(dm.value)") 
dc2.mulValue() 
print ("value: \(dm.value)") 
相關問題