2011-12-15 9 views
0

私のアプリは、appdelegateと複数のviewcontrollerで構成されています。どのようにappcontleateはviewcontrollerのメソッドを呼び出すことができますか?

appdelegateでcronジョブが実行されています(外部データの取得など)。データが更新されると、appdelegateはviewcontrollerのデータソースを更新し、そのviewcontrollerからreloadDataメソッドを呼び出す必要がありますか?

問題を解決するにはどのアプローチを使用しますか? NSNotificationは良い方法ですか?プロトコルやデリゲートはどうですか?

ありがとうございました。

+2

私は通知を受け取ります。後でcronジョブをどこにでも移すことができ、代理人やプロトコルを書き直す必要はありません。 NSNotificationは実装が容易で、そのようなシナリオでうまくいきます。 –

答えて

2

私は数日前と同じ要件を持っていました。最初に私はあなたが投稿して受け取る通知を[NSNotificationCenter defaultCenter]を使って行った。しかし、私はこのアプローチに問題がありました。何らかの理由でこれを信頼できないし、デバッグするのが難しいと感じました。

次に、私は次のように実装しました。すべてのカスタム通知を処理するクラスがあります。このクラスはいくつかのオブザーバ配列を保持しています。たとえば、配列には特定のイベントを通知するいくつかのビューコントローラがあり、別の配列は別のイベントの通知を受けたいビューコントローラを保持しています。

イベントのオブザーバーにしたいView Controllerを作成するときに、このマネージャークラスの関連配列にコントローラーを追加します。

そして、あなたのアプリケーションデリゲートでイベントが発生すると、このイベントをすべてのオブザーバビューコントローラに通知するようにこのマネージャクラスに指示します。次に、このマネージャクラスは、関連する配列を反復し、これらのオブザーバのいくつかの特定のメソッドを呼び出します。したがって、同じイベントに関心を持つすべてのView Controllerには、同じ名前のパブリックメソッドが必要なので、通知マネージャーはこれを呼び出すことができます。

これは...など、同じ興味を持っているこれらのビューコントローラはプロトコルを実装したように、当然のことながら

を改善することができるがここで私が言いたいの要約です。これは私の通知マネージャークラスです:

@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)がそのクラスが何を言いたいのかを知ることに興味がある状況ではありません。クラスがリッスンとその数を知ることに興味がない場合は通知を使用します。通知の登録者と番号は誰でも登録できます。

0

私はあなたのコードをあまり緊密に結合させるための通知を受け取ります。

関連する問題