2011-12-15 89 views
0

我的应用程序由一个appdelegate和几个视图控制器组成。appdelegate如何调用viewcontroller的方法?

cron作业正在appdelegate中运行(如获取外部数据)。当数据更新时,appdelegate需要更新其中一个viewcontroller的数据源,然后从该viewcontroller调用reloadData方法?

我应该使用哪种方法来解决问题? NSNotification是一个好方法吗?协议或委托如何?

谢谢。

+2

我会去通知 - 你可以稍后移动cron作业到任何地方,而不必重写代表和协议。 NSNotifications很容易实现,并在这种情况下表现良好。 – 2011-12-15 07:17:33

回答

2

我和前几天有相同的要求。起初,我去了通知,那些你发布和使用[NSNotificationCenter defaultCenter]。但是我遇到了这种方法的问题,由于某些原因,我发现这种方法不可靠,很难调试。

然后我实现了这样的东西:我有一个类来处理我所有的自定义通知。这个类保留了一些观察者数组,例如一个数组包含一些视图控制器,它们想要被通知某个事件,另一个数组包含一些想要被通知另一个事件的视图控制器,等等。

当您创建您想要成为某个事件的观察者的视图控制器时,可以将控制器添加到此经理类的相关数组中。

然后,当您的应用程序委托中发生事件时,您告诉此经理类通知所有观察者视图控制器此事件。然后这个经理类在相关数组中迭代并调用这些观察者的某些特定方法。所以,为此,每个对同一事件感兴趣的视图控制器都应该有一个具有相同名称的公共方法,以便通知管理员可以调用此方法。

这当然可以提高,就像具有相同的利益,这些视图控制器实现协议等。

这里是我的意思的摘要。这是我通知管理器类:

@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

我想说,当存在“主/从”关系时(委托人知道关于类和类的知道委托),在控制层次结构中有更高的一个类,并且当清楚将不会是其他元素(主要是用户界面)有兴趣知道班级说什么的情况。当班级不知道谁在监听以及他们有多少人时,可以使用通知,任何人和任何号码都可以注册通知。

0

我会去与通知,使您的代码更紧密耦合。

相关问题