【问题标题】:MVC Pattern: Where does formatting/processing type work belong? (Objective-C)MVC 模式:格式化/处理类型工作属于哪里? (目标-C)
【发布时间】:2010-02-04 01:46:16
【问题描述】:

随着我的 Cocoa 技能逐渐提高,我尝试不滥用 MVC,因为我发现自己回到了我之前的假设所建​​立的漏洞中。我这里没有人可以解决这个问题,所以希望你们中的一个可以帮助...

我有一个自定义模型类,它有许多不同的属性(NSString、NSDate、NSNumber 等)。我需要序列化传输的属性。有时,在处理此数据以进行序列化时,可能会出现用户需要回答的问题(UIAlertView 等)

不用纠结于太多细节,这段代码属于哪里?

  • 我的一部分说模型,因为它是关于数据的持久性 - 在某种程度上。
  • 我的一部分说查看,因为它是对模型中包含的核心数据(没有双关语)的另一种解释。在处理数据时,用户有时必须与对话框进行交互
  • 我的一部分说 Controller,因为它负责管理模型和视图之间的数据转换。

是三者的结合吗?如果是这样,在处理数据时如何处理类之间的通信? NS通知?直接方法调用?

【问题讨论】:

    标签: objective-c cocoa-touch model-view-controller cocoa-design-patterns


    【解决方案1】:

    这可能是您想要使用访问者模式的东西 -- http://en.wikipedia.org/wiki/Visitor_pattern -- 因为您最终可能希望对不同的事物使用不同类型的序列化,并且您可以拥有不同的访问者类而不是很多模型代码中的特殊情况。

    这里是关于 Objective-c/cocoa 中访问者模式的讨论:http://www.cocoadev.com/index.pl?VisitorPattern

    这是 Dobbs 博士关于 Objective-c 中的访问者模式的(旧的!!!)文章:http://www.drdobbs.com/184410252

    您正在处理的问题不适合 MVC 范例的原因是您正在执行的序列化就像基于流的渲染表面上的视图并且它被显示。有时,这可以在模型中非常顺利地完成,但有时它更复杂,您需要查看您的案例以确定它是哪一个。

    通常,您正在使用的传输/Web 服务(或其他)代码将有自己的处理此数据的处理程序,例如 ObjectiveResource 添加一个序列化和反序列化处理程序,作为 NSObject 的扩展,使其能够透明地做很多这样的事情,如果你想更通用地做这件事,你可能会查看那个代码(特别是 ObjectiveSupport 部分)。

    【讨论】:

      【解决方案2】:

      通常,几乎所有应用程序特定的代码都属于控制器。控制器应与模型交互并观察(通过通知)并根据需要更新视图。

      如果您正在进行模型处理,以便它可以在具有相同模型的另一个应用程序中重复使用,那么该处理可能在模型中。

      视图可以在 Interface Builder 中布局或在代码中创建和/或为自定义绘图创建子类,但它们不应具有应用程序逻辑并且不会直接与模型交互。

      【讨论】:

        【解决方案3】:

        我建议将序列化代码放入模型中。如果进程失败,它可以向正在监听它的任何东西(视图/控制器)报告,然后它可以呈现 UIAlertView,更正问题并重新提交以进行另一次尝试。

        【讨论】:

          【解决方案4】:

          我会在模型中说。

          序列化数据的调用将由控制器完成。如果数据不能被序列化,那么模型应该返回一个控制器必须处理的错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-16
            • 1970-01-01
            • 1970-01-01
            • 2014-12-18
            • 1970-01-01
            • 1970-01-01
            • 2011-04-12
            • 2011-07-07
            相关资源
            最近更新 更多