2012-04-25 58 views
3

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

比方说,我使用协议创建对象,并从该对象中收集大量其他对象的数据。我将符合我的协议的每个对象添加到数组中。然后,我只需循环它并在每个代理上调用我的方法。

NSMutableArray *collectFromDelegates = [NSMutableArray alloc]init]; 

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

这是错误的吗?

回答

9

这不是真的delegation

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

让多个对象处理一个事件对你来说没有什么意义,因为它已经被处理了。我可以看到有多个委托的唯一原因是如果第一个处理事件失败,它可以传递给下一个,直到某个对象处理它。

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

另一种情况下,您经常需要多个对象正在接收事件的通知。这不是委派,因为对象不是为对象工作的,只是作用于发生在对象上的事情。这通过使用通知或观察更好地实现。

0

一般来说,当您想要发送多个对您的课程感兴趣的课程时,您可以使用NSNotification s。但是,这将不允许他们返回数据,除非您允许他们发送消息给通知的object。我不确定这是否会是一个更清洁的解决方案。

1

苹果的惯例是只有一个“委托”对象。但是,如果这是您所需要的,您可以设置自己的班级以拥有一组委托人。为了清晰起见,您可能想给他们打电话。

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

1

委托只是一个抽象的概念 - 您可以拥有尽可能多的代表。但是,这很少需要,通常也是一个不好的模式。

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

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

希望这会有所帮助!

0

旁边提到的Notifications的一种方法可能是,您的委托实现包含一个符合协议的对象数组,并将此协议方法作为包装调用。

1

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

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

不同的使用情况......

1

我读过一个对象一次只能有一个委托。但事实确实如此?

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

相关问题