允许人们将代理方法调用多播到多个代理对象。
更新以配合 Swift。查看示例以获取更多详细信息。
它使用一些运行时方法,如 respondsToSelector:、methodSignatureForSelector: 和 forwardInvocation: 来实现方法调用的类型转换。
您可以设置对象的代理属性如下:
XLYMultiCastDelegate *multiCastDelegate = [[XLYMultiCastDelegate alloc]initWithConformingProtocol:@protocol(AProtocol)];
[multiCastDelegate addDelegate:firstDelegate dispatchQueue:firstDispatchQueue];
[multiCastDelegate addDelegate:secondDelegate dispatchQueue:secondDispatchQueue];
object.delegate = (id<AProtocol>)multiCastDelegate;
然后,当对象调用一个代理方法,例如 'hello' 时,MultiCastDelegate 可以将调用转发给 firstDelegate,然后是 secondDelegate。firstDelegate 将在 firstDispatchQueue 中接收 'hello',secondDelegate 会在 secondDispatchQueue 中接收。
这与正常代理不同。正常代理只能是一个符合 'AProtocol' 的单个对象,而使用 MultiCastDelegate,所有有趣的对象都可以接收方法调用。
它也与通知不同。通知需要一个字符串作为通知名和一个在发布通知时调用的选择器。开发者还应在适当的时候移除观察者。MultiCastDelegate 需要添加的所有代理都确定一个协议,否则运行时添加动作将失败。它使用方法调用而不是字符串和选择器来实现多通知,这更难以维护。