我的应用程序包含一个appdelegate和几个viewcontrollers。
在appdelegate中正在运行cron作业(如获取外部数据)。更新数据时,appdelegate需要更新其中一个viewcontroller的数据源,然后从该viewcontroller调用reloadData方法吗?
我应该使用哪种方法来解决问题? NSNotification是一个好方法吗?协议或代表怎么样?
感谢。
答案 0 :(得分:2)
我几天前和你有同样的要求。首先,我使用[NSNotificationCenter defaultCenter]
发送了通知,即您发布和接收的通知。但是我遇到了这种方法的问题,由于某些原因我发现这种方法不可靠且难以调试。
然后我实现了这样的东西:我有一个处理所有自定义通知的类。这个类保留了一些观察者数组,例如一个数组包含一些希望被通知某个事件的视图控制器,另一个数组包含一些希望被通知另一个事件的视图控制器,等等。
当您创建想要成为某个事件的观察者的视图控制器时,可以将控制器添加到此管理器类的相关数组中。
然后,当您的app委托中发生事件时,您告诉此管理器类通知所有观察者视图控制器此事件。然后,此管理器类在相关数组中进行迭代,并调用这些观察者的某些特定方法。因此,为此,每个对同一事件感兴趣的视图控制器都应该具有相同名称的公共方法,以便通知管理器可以调用它。
当然,这可以改进,例如让这些具有相同兴趣的视图控制器实现协议等。
以下是我的意思摘要。这是我的通知经理课程:
@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
这是我将对观察呼叫持续时间感兴趣的视图控制器添加到此经理的观察者数组中的地方:
- (void)arrangeCallDurationObservers {
NSMutableArray *callDurationObservers = [NotificationUtility getCallDurationObservers];
[callDurationObservers removeAllObjects];
[callDurationObservers addObject:_detail];
[callDurationObservers addObject:_callReport];
}
答案 1 :(得分:1)
我会说当有一个“主/从”关系时委托使用委托(委托知道类和类知道委托),一个类在控制层次结构中更高,并且当很明显赢得了不是其他元素(主要是UI)有兴趣了解班级必须说什么的情况。当班级不知道谁听谁以及他们有多少时,使用通知,任何人和任何号码都可以注册通知。
答案 2 :(得分:0)
我会收到通知,以使您的代码不那么紧密耦合。