为什么只有一名代表?

时间:2012-04-25 15:47:24

标签: ios objective-c cocoa-touch

我读过一个对象一次只能有一个委托。 但这是真的吗?

假设我使用协议创建一个对象,并且从该对象中我想从其他几个对象中收集大量数据。我将符合我的协议的每个对象添加到一个数组中。然后我循环遍历它并在每个代理上调用我的方法。

NSMutableArray *collectFromDelegates = [NSMutableArray alloc]init];

//in delegateArray I keep pointers to every delegate.
for(id delegate in delegateArray){
  [collectFromDelegates addObject:[delegate someProtocolMethod]];
}

这是错的吗?

7 个答案:

答案 0 :(得分:9)

那不是delegation

  

委托是一种简单而强大的模式,其中程序中的一个对象代表另一个对象或与另一个对象协同工作。委托对象保持对另一个对象(委托)的引用,并在适当的时间向其发送消息。该消息通知委托代表对象即将处理或刚刚处理的事件。

让多个对象为您处理事件没有多大意义,因为它已经被处理过了。我可以看到有多个委托的唯一原因是,如果第一个无法处理事件,它可以传递给下一个,继续直到某个对象处理它。

在您的示例中,对象充当数据源。这比多个委托更有意义,但可以通过让单个数据源组合来自多个对象的数据来轻松实现,这意味着请求数据的对象不必担心如何组合它。

您经常需要多个对象的另一种情况是接收事件通知。这不是委托,因为对象不适用于对象,只是对对象发生的事情起作用。使用通知或观察可以更好地实现。

答案 1 :(得分:1)

Apple的惯例是只有一个“委托”对象。但是,如果这是您需要的,您可以设置自己的类以拥有一组委托。为清晰起见,您可能希望将其称为其他内容。

在您的示例中,将它们称为“dataSources”可能更合适。

答案 2 :(得分:1)

委托只是一个抽象概念 - 您可以拥有任意数量的委托。但是,这很少需要,而且往往是一种糟糕的模式。

Apple充分利用sourcedelegate模式。源ivars(一种委托形式)提供数据,而委托ivars则用于逻辑响应。也许这是一个更好的解决方案?

或者,您可以使用NSNotification向许多听众通知单个事件。

希望这有帮助!

答案 3 :(得分:1)

一个班级只需要一个代表,如果你有多个代表你正在解决另一个问题。委托模式用于修改类的行为。比方说我们有一个可以吠叫的狗类,但是不同类型的狗以不同的方式吠叫。代表将是改变吠叫行为的一种方式。

如果您需要不止一个,您可能更感兴趣的是观察您的课程正在做什么,它需要通知当前活动的其他人。由于其他几个类可能对一个类的行为感兴趣,因此需要一个数组。在iOS SDK中,已经通过通知为您完成了这项工作。这称为观察者模式。

不同的用例...

答案 4 :(得分:1)

  

我读过一个对象一次只能有一个委托。但这是真的吗?

你在哪里读到的?不,这不是真的。例如,UITableView有两个代理,一个用于提供数据,另一个用于处理操作。

答案 5 :(得分:0)

通常,当您想要发送多个对您所做的内容感兴趣的类时,您可以使用NSNotification s。但是,除非您允许他们向通知的object发送消息,否则不允许他们返回数据。我不确定这是否是一个更清洁的解决方案。

答案 6 :(得分:0)

除了提到的Notifications之外,还有一种方法是,您的委托实现包含符合协议的对象数组,并将此方法作为包装器调用。