У меня было такое же требование, как и у вас несколько дней назад.Сначала я пошел с уведомлениями, которые вы публикуете и получаете, используя [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];
}