【问题标题】:Live UI update of model changes when the model contains plain data structures only当模型仅包含纯数据结构时,模型更改的实时 UI 更新
【发布时间】:2010-06-05 05:41:56
【问题描述】:

请就以下主题向我咨询您的意见:

我有一个模型 - 对象的结构。如:

  • 事件,包含参与者

  • 当前任务

  • 每个任务的受让人

模型将在服务器上腌制并通过网络传输到客户端 GUI 应用程序。因为泡菜,我想让模型类尽可能简单(即只有简单的类,只有数据字段,里面没有任何单一的方法)。因此,我无法在模型对象上创建信号(例如 OnUpdate)。

有时服务器会发送模型更新。例如“任务文本已更改”。应用更新后,我需要将其反映在 UI 中。在任务文本更改的情况下,应更改 UI 中的标签。我只想更改相关控件,因此整个 UI 更新不是最佳解决方案。

另一方面,不希望在搜索更改时遍历整个模型 - 这将太耗费资源。

那么,通知 UI 普通数据结构更改的最佳模式是什么?

【问题讨论】:

  • “信号”? “更新”?你在说什么?数据库触发器?还是某些特定于 Windows 的功能?
  • “这将太耗费资源。”这是什么意思?你有任何测量数据来支持这一点吗?你在说什么“资源”?

标签: python design-patterns architecture


【解决方案1】:

您可能在一个错误的概念下操作:pickles 不包含来自被pickle 的类的代码。您可以在数据结构中添加方法,并且不会增加泡菜的大小。

这是对泡菜的常见误解。它们不包含代码。

【讨论】:

  • 感谢您的回答!但是,如果我将事件处理程序添加到服务器端的模型(即对象将包含有关事件侦听器的数据),腌制对象然后在客户端取消腌制它会发生什么?
  • @Slava Tutushkin:两个地方都存在类定义。只有可变的属性数据被序列化。
【解决方案2】:

您可以添加一个标志,例如self.isOnClientSide,并在每个更新处理程序中检查它,以便在任何一种情况下都可以使用不同的逻辑。

def onUpdateFoo(self):
  if self.isOnClientSide:
    return self.onUpdateFooOnClient()
  else:
    return self.onUpdateFooOnServer()

在取消酸洗后立即相应地更改此标志。

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 2012-01-07
    • 2018-05-18
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多