私は数日前と同じ要件を持っていました。最初に私はあなたが投稿して受け取る通知を[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];
}
私は通知を受け取ります。後でcronジョブをどこにでも移すことができ、代理人やプロトコルを書き直す必要はありません。 NSNotificationは実装が容易で、そのようなシナリオでうまくいきます。 –