Ios 使多个对象成为另一个对象的委托的最佳方法是什么?

Ios 使多个对象成为另一个对象的委托的最佳方法是什么?,ios,cocoa-touch,delegates,core-location,Ios,Cocoa Touch,Delegates,Core Location,我正在创建一个iOS应用程序,它有4个选项卡(4个视图控制器),可以获取CoreLocation更新,并以各种表示形式(表视图、地图视图等)显示位置以及一些其他数据 我只想使用一个CoreLocationManager,因此我只能有一个代理,但4个视图控制器需要了解更新,以便更新可见视图 让我的视图控制器知道有位置更新的最佳方法是什么?最好的方法可能只是使用通知中心。不要使用@协议,而是使用一个用于通知的NSString*const: NSString * const kMyNotificati

我正在创建一个iOS应用程序,它有4个选项卡(4个视图控制器),可以获取CoreLocation更新,并以各种表示形式(表视图、地图视图等)显示位置以及一些其他数据

我只想使用一个CoreLocationManager,因此我只能有一个代理,但4个视图控制器需要了解更新,以便更新可见视图


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

最好的方法可能只是使用通知中心。不要使用
@协议
,而是使用一个用于通知的
NSString*const

NSString * const kMyNotificationString @"MyNotificationString"
现在,当潜在代表需要回应时,简单到:

[[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationString
                                                    object:nil];
任何需要响应此通知的对象都可以
#导入
此头文件(因此它会获取
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];
    }
}
for(self.arrayOfDelegates中的id对象){
if([object respondsToSelector:@selector(myMethod)]){
[对象方法];
}
}

最好的方法可能是简单地使用通知中心。不要使用
@协议
,而是放置一个用于通知的
NSString*const

NSString * const kMyNotificationString @"MyNotificationString"
现在,当潜在代表需要回应时,简单到:

[[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationString
                                                    object:nil];
任何需要响应此通知的对象都可以
#导入
此头文件(因此它会获取
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];
    }
}
for(self.arrayOfDelegates中的id对象){
if([object respondsToSelector:@selector(myMethod)]){
[对象方法];
}
}

最好的方法可能是简单地使用通知中心。不要使用
@协议
,而是放置一个用于通知的
NSString*const

NSString * const kMyNotificationString @"MyNotificationString"
现在,当潜在代表需要回应时,简单到:

[[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationString
                                                    object:nil];
任何需要响应此通知的对象都可以
#导入
此头文件(因此它会获取
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];
    }
}
for(self.arrayOfDelegates中的id对象){
if([object respondsToSelector:@selector(myMethod)]){
[对象方法];
}
}

最好的方法可能是简单地使用通知中心。不要使用
@协议
,而是放置一个用于通知的
NSString*const

NSString * const kMyNotificationString @"MyNotificationString"
现在,当潜在代表需要回应时,简单到:

[[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationString
                                                    object:nil];
任何需要响应此通知的对象都可以
#导入
此头文件(因此它会获取
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];
    }
}
for(self.arrayOfDelegates中的id对象){
if([object respondsToSelector:@selector(myMethod)]){
[对象方法];
}
}

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


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

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


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

最简单的方法是发布通知