【问题标题】:What is the best way of making more than one object a delegate of another object?使多个对象成为另一个对象的委托的最佳方法是什么?
【发布时间】:2014-02-15 20:05:09
【问题描述】:
我正在创建一个带有 4 个选项卡(4 个视图控制器)的 iOS 应用程序,它获取 CoreLocation 更新并以各种表示形式(表格视图、地图视图等)显示位置以及其他一些数据
我只想使用一个CoreLocationManager,所以我只能有一个delegate,但是需要4个视图控制器知道更新,以便可见视图可以更新
让我的视图控制器知道位置更新的最佳方式是什么?
【问题讨论】:
标签:
ios
cocoa-touch
delegates
core-location
【解决方案1】:
最简单的方法是发布通知而不是使用委托。代表是 1:1,而通知是 1:many。问题是您仍然需要至少一名代表来发布通知。
如果需要,您可以创建一个 NSProxy 对象,您可以将其设置为位置管理器委托,并在内部保存其他委托的列表并将所有接收到的方法调用转发给所有内部管理的委托。
【解决方案2】:
最好的方法可能是简单地使用通知中心。不要使用@protocol,而是使用您用于通知的NSString * const:
NSString * const kMyNotificationString @"MyNotificationString"
现在,当潜在的代表需要响应时,很简单:
[[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationString
object:nil];
任何需要响应这个通知的对象都可以#import这个头文件(所以它会得到NSString * const-ed通知名称,然后开始监听通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(myMethod)
name:kMyNotificationString
object:nil];
只是不要忘记在您解除分配时(或之前)删除观察者。
或者,有这种方法......但它并不是那么好,我实际上建议不要这样做。
您可以拥有一个处理“委托”的NSArray 属性,而不是单个委托属性(确保您有一个仅添加对数组的弱引用的“addDelegate”方法)。然后,当您需要所有这些对象来响应更改时:
for (id<MyProtocol> object in self.arrayOfDelegates) {
if ([object respondsToSelector:@selector(myMethod)]) {
[object myMethod];
}
}
【解决方案3】:
最简单的方法是实现一个将消息作为通知转发的委托,这样任何数量的对象都可以订阅这些通知的观察者。