2017-06-18 59 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)") 
相关问题