2011-12-15 38 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

我會去與通知,使您的代碼更緊密耦合。

相關問題