2014-02-15 108 views
0

我创建有4个选项卡(4个视图控制器)是获得CoreLocation更新,并在各种表示一些其他数据(表视图,地图视图等)将多个对象作为另一个对象的委托的最佳方式是什么?

我只想沿着显示位置的iOS应用使用一个CoreLocationManager,所以我只能有一个代表,但4个视图控制器需要知道有关更新,以便可见视图可以更新

什么是让我的视图控制器知道有一个最佳方法位置更新?

回答

0

最好的方法可能是简单地使用通知中心。而不是@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]; 

当你(或之前)你dealloc时,不要忘记删除观察者。


另外,有这种方法......但它并不是真的很棒,我实际上不推荐它。

而不是一个委托属性,您可以有一个NSArray属性处理“委托”(确保您有一个“addDelegate”方法,只添加到数组的弱引用)。然后,当您需要所有这些对象来响应更改时:

for (id<MyProtocol> object in self.arrayOfDelegates) { 
    if ([object respondsToSelector:@selector(myMethod)]) { 
     [object myMethod]; 
    } 
} 
3

最简单的方法是发布通知而不是使用委托。代表是1:1,其中通知为1:很多。问题是您仍然需要至少一个将发布通知的代理。

如果需要,您可以创建一个NSProxy对象,您可以将其设置为位置管理器委托,并在内部保存其他委托的列表,并将所有接收到的方法调用转发给所有内部管理的委托。

0

最简单的方法是实现一个将消息转发为通知的委托,这样任何数量的对象都可以订阅这些通知的观察者。

相关问题