【问题标题】:How to share a Data object among a set of delegates?如何在一组委托之间共享一个数据对象?
【发布时间】:2013-06-27 18:24:49
【问题描述】:

按照各种 Objective-C 编程指南中强调的 MVC 模式,当我使用带有控制器的模型时,我应该将控制器设置为给定模型的delegate。现在我有一个巨大的数据对象,创建起来非常昂贵,并且有一些控制器需要使用这个数据对象。只要将delegate 属性设置为正确的控制器,Data 对象就可以在该控制器上正常工作。有没有办法在这些控制器之间共享这个模型?

我已经集思广益了一段时间,但还没有想到任何特别好的解决方案。我想出了一些事情

  1. 使用通知中心(但仅针对这种特定情况建立这种关系似乎很昂贵)
  2. 使 Data 对象的每个方法都采用 delegate 参数:这是我目前正在使用的,但它很笨重并且已达到其极限

编辑

感谢那些建议我使用 NSArray 的人。我想我忘了包括这个微妙之处:

就我而言,假设其中一位代表A 想要通过使用其特定方法之一来查询Data 对象。如果 Data 对象的 delegate 字段设置为 A,则结果将是正确的。但是据我了解,使用数组并在每个委托上调用该方法不会给我想要的答案。

事实上,由于我的 Data 对象不知道哪个委托正在调用它,因此即使它知道应该与之关联的所有委托,它也无法返回正确的结果

对此有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您可以使用委托创建一个NSArray,然后只需在数组中的每个委托上调用该方法。 (注意保留周期)。

    【讨论】:

      【解决方案2】:

      如果您不想使用通知,可以尝试使用多播委托方法。在这种情况下,您将保留一个NSMutableArray 代表而不是一个代表。因此,您可以从委托数组中添加和删除委托,而不是设置委托。调用委托时,您将在数组中的每个委托上调用该委托方法,检查每个委托是否响应该特定回调。 如果您愿意,您还可以控制调用委托的顺序,因为您自己创建和管理委托数组。

      【讨论】:

        【解决方案3】:

        我最终做的是设置另一个级别的间接 - 每个控制器将与一个“中间件”对象通信,该对象又与数据对象通信。通过这种方式,保留了常见的委托 - 委托方法,而 Data 对象只需要创建一次 - 代价是为每个控制器添加了“中间人”对象。

        在我的示例中,“中间件”对象将设置一个控制器作为其委托属性,当该控制器想要了解有关数据对象的信息时,“中间件”对象将使用其委托属性从数据对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-14
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-11
          • 2017-05-29
          相关资源
          最近更新 更多