【问题标题】:Objective-C - Passing Model Objects to a Worker Class From a ControllerObjective-C - 将模型对象从控制器传递给 Worker 类
【发布时间】:2009-12-21 11:34:59
【问题描述】:

我是第一个 iPhone 项目的新手。我做了 4 年的 .NET 开发人员,为您介绍我来自哪里的背景知识。我正在尝试遵循 MVC 模式并在我的第一个项目中以正确的方式做事。我不想为了让它们发挥作用而拼凑起来。

这是我的情况: 我正在尝试解析仅包含 1 个对象的 XML 提要。我有一个模型对象,它代表我将从解析 XML 提要中获得的对象。我对 NSXMLParser 进行了子类化,并且能够成功解析 XML 提要并取回值(使用 NSLog 检查值)。这是我断开连接的地方。从我的控制器移动到子类时,调用 XMLParser、填充模型对象并将其返回给控制器的最佳方法是什么?

我正在寻找某种可以遵循的模式,这将被视为最佳实践。我不想把所有的逻辑都扔到控制器上的一个方法中,让它在任何情况下都无法重用。

【问题讨论】:

    标签: iphone objective-c model-view-controller


    【解决方案1】:

    如果您让视图控制器实现NSXMLParserDelegate 协议,并将NSXMLParser 实例的delegate 属性设置为您的视图控制器,您的视图控制器将知道解析器何时parses stufffinishes its work。换句话说,一旦解析器子类告诉委托它已经完成,视图控制器就可以使用填充的数据模型。

    顺便说一句,delegation 是 OS X 应用程序(尤其是 Apple API)大量使用的少数设计模式之一。在您进行 iPhone 开发时,您可能会在任何地方找到并使用委托。

    如果您不想使用委托,另一种选择是实现观察者模式,将notificationsNSNotificationCenter 发送给观察者,观察者在听到通知时调用他们的选择器(方法)。通知优于委托的优点是您可以让大量对象监听通知,而在给定时间通常只有一个对象可以成为委托。

    【讨论】:

    • @Alex Reynolds - 这是很棒的信息。我想我会尝试代理路线。我已经看到了一些使用对象初始化类(在本例中为 NSXMLParser)的示例,例如创建一个 initWithCustomObject 方法,并传入我想用来填充视图的对象。然后当解析完成时,我将使用该对象来填充视图上的 UI 元素。这是最好的方法吗?
    【解决方案2】:

    您可以创建一个单例类,它将管理您的所有共享操作。你可以找到创建单例对象的快速教程here

    【讨论】:

      【解决方案3】:

      我会将解析操作放在操作队列中的 NSOperation 中。然后它可以在后台线程上执行(请注意,您必须做一些额外的工作才能实现 NSOperation 中的异步操作)。

      解析完成后,将结果存储在其他控制器可以看到的地方,并发出对象准备就绪的通知。您可能还想针对错误情况发出通知,以便等待加载完成的控制器知道他们永远不会得到对象。

      您也可以使用 Alex 提到的委托,但通知通常更灵活,因为您可以让几个不同的对象对负载做出反应。

      【讨论】:

        猜你喜欢
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        相关资源
        最近更新 更多