【问题标题】:Best way to communicate between ViewModel and ControllerViewModel 和 Controller 之间通信的最佳方式
【发布时间】:2017-11-20 17:54:09
【问题描述】:

我是开发新手,最近在实践 MVVM 设计模式。为了在 ViewModel 和控制器之间进行通信,我使用了 Closure。我知道我也可以使用 Delegate。但是有什么约定或理由我应该遵循什么特定的方式进行交流。我有点困惑。任何帮助将不胜感激。

【问题讨论】:

  • 这种情况下的通信是指变量互换?
  • 是的。我正在 ViewModel 类中准备我的 DataArray,它将被发送到控制器以提供我的 TableView。

标签: ios objective-c swift mvvm


【解决方案1】:

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

将闭包从 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

【讨论】:

  • 感谢您的时间和链接。
  • 使用闭包可以达到和delegate一样的目的,即BLL不需要知道闭包中的实现细节
【解决方案2】:

您有很多选择,具体取决于您应用的结构。一种是使用单例。对于不太复杂的应用程序,我更喜欢这种方法。位于单例类中的数据处理(存储、结构化)。从这个单例类访问数据的不同视图。例如,您有一个名为 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)")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2015-08-10
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多