ViewModel和Controller之间最好的通信方式是什么?

5

我是一个新手开发者,最近正在练习MVVM设计模式。为了在ViewModel和Controller之间通信,我使用闭包。我知道也可以使用Delegate。但是,有没有任何惯例或原因要遵循特定的通信方式呢?我有点困惑。任何帮助将不胜感激。


在这种情况下,通信的意思是变量的交换吗? - user6338195
是的。我正在ViewModel类中准备我的DataArray,并将其发送到控制器以提供给我的TableView。 - MarkMe
2个回答

7
我也在寻找这个答案,我找到了这个:
将闭包从UI层(UIL)传递到业务逻辑层(BLL)会破坏关注点分离(SOC)。您正在准备的数据驻留在BLL中,因此实际上您将要说“嘿BLL,为我执行这个UIL逻辑”。这就是一个SOC。(在这里找到更多https://en.wikipedia.org/wiki/Separation_of_concerns。)
BLL只能通过委托通知与UIL通信。这样,BLL基本上在说:“嘿UIL,我执行完我的逻辑了,这里有一些数据参数,你可以用它们来操作UI控件,如你所需。”
因此,UIL永远不应该要求BLL为其执行UI控件逻辑。只应该要求BLL通知他。
这是链接,您将获得更清晰的视图。 iOS中使用MVVM

谢谢您的时间和提供链接。 - MarkMe
使用闭包可以实现与委托相同的目标,即BLL不需要知道闭包中的实现细节。 - Alex Bin Zhao

0

根据您的应用程序结构,您有很多选择。其中之一是使用单例模式。对于不太复杂的应用程序,我更喜欢这种方法。数据处理(存储、结构化)位于单例类中。不同的视图从此单例类访问数据。例如,您可以使用名为DataManager或类似名称的单例。不同的控制器和其他简单结构从此单例中访问所需的数据。

以下是一个非常简单的示例代码:

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)")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接