델리게이트는 A객체와 B객체가 강하게 묶여 객체가 여러개가 되면 관리가 힘이 들어진다. 예를 들어 결제 과정을을 본다면 결제 안내 페이지에서 금액이 2000원으로 나온다고 하고 여기서 쿠폰을 사용한다고 해보자. 쿠폰 선택화면 안에 프로모션 화면등 그 안에 2~3단계의 화면이 더 들어갈 수도 있다. 최종적으로 결정하는 화면과 제일 처음에 봤던 결제 화면간을 델리게이트로 연결을 하면 여간 복잡하고 귀찮은 일이 아니다. 이럴때는 NotificationCenter를 사용하는게 좋다. 중간에 NotificationCenter가 메시지를 관리해서 처음 결제화면에 구독을 누르고 마지막 쿠폰 화면에서 NotificationCenter로 알림을 보내면 간단하게 데이터를 주고 받을 수 있다.
1 2 3 4 5 |
//노티피케이션 센터에 등록 receiveNotification으로 노티피케이션을 보내면 receiveNotification: 호출한다 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(receiveNotification:) name:@"receiveNotification" object:nil]; |
구독 할 객체(결제 화면)에서 간단하게 구독할 Notification의 이름을 정해주고 해당 이름으로 알림이 오면 호출할 메소드를 정해준다.
1 2 3 4 |
//receiveNotification이름으로 노티피케이션 센터에 알림을 보낸다 [[NSNotificationCenter defaultCenter]postNotificationName:@"receiveNotification" object:@"close" userInfo:@{@"action":@"closeAction"}]; |
그후 알림을 보낼 (쿠폰화면)에서 취할 액션에 다음과 같이 NotificatinoCenter로 알림을 보낸다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-(void)receiveNotification:(NSNotification *)noti{ NSLog(@"노티피케이션 오브젝트 : %@", noti.object); NSLog(@"노티피케이션 userInfo : %@", noti.userInfo); //userInfo안에 action키의 값이 closeAction이면 뷰를 삭제한다 if ([noti.userInfo[@"action"] isEqualToString:@"closeAction"]) { //뷰를 삭제하며 더 이상 receiveNotification를 통하여 알림을 받지 않기 위해 삭제한다 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"receiveNotification" object:nil]; [notificationViewController.view removeFromSuperview]; //userInfo안에 action키의 값이 changeAction값이면 라벨의 색상을 바꾼다 } else if ([noti.userInfo[@"action"] isEqualToString:@"changeAction"]) { textLabel.backgroundColor = [self randomColor]; } } |
이제 마지막으로 알림을 받은 객체(결제화면)에서 알맞게 이벤트 처리를 해주면 된다. 만약 해당 알림을 더 이상 사용할거 같지 않다면 반드시 – (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject; 등을 호출하여 알림 구독을 취소해주는게 앱 성능향상에 큰 도움이 된다.
델리게이트 패턴보다 더 쉽고 간단하고 편하게 사용 할 수 있지만 너무 많이 쓰면 나중에는 어떤 화면에서 노티피케이션을 보냈는지 모르고 예상치 못한 알림의 발송등으로 디버깅하기가 매우 힘들어진다. 개발자의 판단에 맞추어 알맞은 패턴을 사용하는게 좋겠다.