3

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

假设我使用协议制作了一个对象,并且我想从该对象中收集来自其他几个对象的大量数据。我将每个符合我的协议的对象添加到一个数组中。然后我只是循环遍历它并在每个委托上调用我的方法。

NSMutableArray *collectFromDelegates = [NSMutableArray alloc]init];

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

这是错的吗?

4

7 回答 7

9

那不是真正的代表团

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

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

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

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

于 2012-04-25T16:00:03.207 回答
1

Apple 的惯例是只有一个“委托”对象。但是如果你需要的话,你可以设置你自己的类来拥有一个代表数组。为了清楚起见,您可能想将它们称为其他名称。

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

于 2012-04-25T15:52:34.147 回答
1

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

如果你需要不止一个,你可能对观察你的班级在做什么更感兴趣,它需要通知其他人当前的事件。由于其他几个类可能对一个类的行为感兴趣,因此您需要一个数组。在 iOS SDK 中,这已经为您完成了通知。这称为观察者模式。

不同的用例...

于 2012-04-25T15:55:39.890 回答
1

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

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

于 2012-04-25T16:05:15.640 回答
1

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

苹果很好地利用了asourcedelegate模式。源 ivars(委托的一种形式)提供数据,而委托 ivars 被调用以进行逻辑响应。也许这是一个更好的解决方案?

或者,您可以使用NSNotification通知多个侦听器单个事件。

希望这可以帮助!

于 2012-04-25T15:53:31.110 回答
0

通常,当您想向多个对您的班级所做的事情感兴趣的班级发送消息时,您会使用NSNotifications. 但是,除非您允许他们向通知发送消息,否则这将不允许他们返回数据object。我不确定这是否是一个更清洁的解决方案。

于 2012-04-25T15:51:03.780 回答
0

除了提到的通知之外,一种方法可能是,您的委托实现包含一个符合协议的对象数组,并在其上调用协议方法作为包装器。

于 2012-04-25T15:55:02.230 回答