我的应用程序由一个 appdelegate 和几个 View Controller 组成。
一个 cron 作业正在 appdelegate 中运行(比如获取外部数据)。当数据更新时,appdelegate 需要更新其中一个 viewcontroller 的数据源,然后从该 viewcontroller 调用 reloadData 方法?
我应该使用哪种方法来解决问题? NSNotification 是一个好方法吗?协议(protocol)或委托(delegate)怎么样?
谢谢。
最佳答案
我前几天也有和你一样的需求。起初我使用通知,那些你使用 [NSNotificationCenter defaultCenter]
发布和接收的通知。但是我在使用这种方法时遇到了问题,出于某些原因,我发现这种方法不可靠且难以调试。
然后我实现了这样的事情:我有一个类来处理我所有的自定义通知。这个类保存了一些观察者数组,例如一个数组保存了一些想要通知某个事件的 View Controller ,另一个数组保存了一些想要通知另一个事件的 View Controller ,等等。
当您创建要成为某个事件的观察者的 View Controller 时,您将 Controller 添加到该管理器类的相关数组中。
然后,当您的应用委托(delegate)中发生事件时,您告诉该管理器类将此事件通知所有观察者 View Controller 。然后这个管理器类在相关的数组中迭代并调用这些观察者的某些方法。因此,要做到这一点,每个对同一事件感兴趣的 View Controller 都应该有一个同名的公共(public)方法,以便通知管理器可以调用它。
这当然可以改进,比如让这些具有相同兴趣的 View Controller 实现一个协议(protocol)等。
这是我的意思的总结。这是我的通知管理器类:
@interface NotificationUtility : NSObject
+(NSMutableArray *)getCallDurationObservers;
+(void)notifyCallDurationObservers;
@end
这是实现的一部分:
#import "NotificationUtility.h"
static NSMutableArray *callDurationObservers = nil;
@implementation NotificationUtility
+(NSMutableArray *)getCallDurationObservers {
if (callDurationObservers) {
return callDurationObservers;
}
callDurationObservers = [[NSMutableArray alloc] init];
return callDurationObservers;
}
+(void)notifyCallDurationObservers {
for (TestViewController *observer in callDurationObservers) {
[observer performSelector:@selector(updateCallDuration)];
}
}
@end
这是我将对观察调用持续时间感兴趣的 View Controller 添加到该管理器的观察者数组的地方:
- (void)arrangeCallDurationObservers {
NSMutableArray *callDurationObservers = [NotificationUtility getCallDurationObservers];
[callDurationObservers removeAllObjects];
[callDurationObservers addObject:_detail];
[callDurationObservers addObject:_callReport];
}
关于iphone - appdelegate 如何调用 viewcontroller 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8516318/