如何在一组代理中共享Data对象?

时间:2013-06-27 18:24:49

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

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

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

  1. 使用通知中心(但仅针对此特定情况设置此类关系似乎很昂贵)
  2. 使Data对象的每个方法都采用delegate参数:这就是我现在正在使用的,但它很笨重并达到了极限
  3. 修改

    感谢那些使用NSArray建议我的人。我想我忘了包含这个副词:

    对于我的情况,其中一个代表A想要使用其特定方法之一查询Data对象。如果Data对象的delegate字段设置为A,则结果将是正确的。但据我所知,使用数组并在每个代表上调用方法都不会给我我想要的答案。

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

    有没有想过这个?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我最终做的是设置另一级间接 - 每个Controller将与'中间件'对象进行通信,后者又与Data对象进行通信。通过这种方式,保留了公共委托 - 委托方法,而Data对象只需要创建一次 - 代价是为每个Controller添加'middleman'对象。

在我的示例中,'middleware'对象将Controller设置为其delegate属性,当Controller想要知道有关Data对象的信息时,'middleware'对象将使用其delegate属性来查询来自数据对象。