며칠 전 당신과 같은 요구 사항이있었습니다. 처음에 나는 당신이 게시하고 수신을 사용하여 통지와 함께 갔다. 하지만이 방법에 문제가있었습니다. 몇 가지 이유 때문에 신뢰할 수없고 디버깅하기 힘든 것으로 나타났습니다.
다음과 같이 구현했습니다. 모든 사용자 정의 알림을 처리하는 클래스가 있습니다. 이 클래스는 옵저버 배열을 유지합니다. 예를 들어 배열에는 특정 이벤트에 대한 알림을 받고 싶은 일부보기 컨트롤러가 있고 다른 배열에는 다른 이벤트에 대한 알림을 받고 싶은 일부보기 컨트롤러가 있습니다.
일부 이벤트의 관찰자가 되려는보기 컨트롤러를 만들 때이 관리자 클래스의 관련 배열에 컨트롤러를 추가합니다.
그리고 응용 프로그램 대리인에서 이벤트가 발생하면 모든 관리자에게이 이벤트를 알리도록이 관리자 클래스에 알립니다. 그런 다음이 관리자 클래스는 관련 배열에서 반복하고 이러한 관측자의 특정 메소드를 호출합니다. 따라서 동일한 이벤트에 관심이있는 모든 뷰 컨트롤러에는 알림 관리자가이를 호출 할 수 있도록 같은 이름의 공용 메서드가 있어야합니다.
이
은
는 여기에 내가 무엇을 의미하는지에 대한 요약이다 등등, 프로토콜을 구현 같은 관심을 가지고 이러한 뷰 컨트롤러를 가지고처럼, 물론 개선 할 수있다. 이것은 구현의 일부입니다
@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은 구현하기 쉽고 그러한 시나리오에서 잘 수행됩니다. –