在ViewModel和Controller之间进行通信的最佳方式

时间:2017-06-18 12:22:02

标签: ios objective-c swift mvvm

我是开发新手,最近练习MVVM设计模式。在ViewModel&控制器我正在使用Closure。我知道我也可以使用Delegate。但是有什么惯例或理由我应该遵循什么样的沟通方式。我有点困惑。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

我也在寻找这个答案,我找到了这个,

将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通知他。

这是链接,您将获得更清晰的视图。

Usage of MVVM in iOS

答案 1 :(得分: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)")