2011-12-15 3 views
0

내 앱은 앱 컨트롤러와 여러 개의 뷰 컨트롤러로 구성됩니다.appcontleate는 viewcontroller의 메소드를 호출 할 수 있습니까?

appdelegate에서 cron 작업이 실행 중입니다 (예 : 외부 데이터 가져 오기). 데이터가 업데이트되면 appdelegate가 viewcontroller 중 하나의 데이터 소스를 업데이트 한 다음 해당 viewcontroller에서 reloadData 메서드를 호출해야합니다.

문제를 해결하기 위해 어떤 방법을 사용해야합니까? NSNotification은 좋은 방법입니까? 프로토콜 또는 위임은 어떨까요?

감사합니다.

+2

알림과 함께 갈 수 있습니다 - 나중에 cron 작업을 어디서나 이동할 수 있으므로 대리인과 프로토콜을 다시 작성할 필요가 없습니다. NSNotification은 구현하기 쉽고 그러한 시나리오에서 잘 수행됩니다. –

답변

2

며칠 전 당신과 같은 요구 사항이있었습니다. 처음에 나는 당신이 게시하고 수신을 사용하여 통지와 함께 갔다. 하지만이 방법에 문제가있었습니다. 몇 가지 이유 때문에 신뢰할 수없고 디버깅하기 힘든 것으로 나타났습니다.

다음과 같이 구현했습니다. 모든 사용자 정의 알림을 처리하는 클래스가 있습니다. 이 클래스는 옵저버 배열을 유지합니다. 예를 들어 배열에는 특정 이벤트에 대한 알림을 받고 싶은 일부보기 컨트롤러가 있고 다른 배열에는 다른 이벤트에 대한 알림을 받고 싶은 일부보기 컨트롤러가 있습니다.

일부 이벤트의 관찰자가 되려는보기 컨트롤러를 만들 때이 관리자 클래스의 관련 배열에 컨트롤러를 추가합니다.

그리고 응용 프로그램 대리인에서 이벤트가 발생하면 모든 관리자에게이 이벤트를 알리도록이 관리자 클래스에 알립니다. 그런 다음이 관리자 클래스는 관련 배열에서 반복하고 이러한 관측자의 특정 메소드를 호출합니다. 따라서 동일한 이벤트에 관심이있는 모든 뷰 컨트롤러에는 알림 관리자가이를 호출 할 수 있도록 같은 이름의 공용 메서드가 있어야합니다.

는 여기에 내가 무엇을 의미하는지에 대한 요약이다 등등, 프로토콜을 구현 같은 관심을 가지고 이러한 뷰 컨트롤러를 가지고처럼, 물론 개선 할 수있다. 이것은 구현의 일부입니다

@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

"마스터/슬레이브"관계가있는 경우 델리게이트 사용 (위임자는 클래스에 대해 알고 있고 클래스는 델리 게이트에 대해 알고 있음), 한 계층 높은 컨트롤 계층을 사용하며 다른 요소 (주로 UI)가 클래스가 무엇을 말하고 있는지를 아는 데 관심이있는 상황이 아닙니다. 학급이 청취자와 그들이 얼마나 많은지 알기를 원하지 않을 때 알림을 사용하십시오. 아무나 번호도 등록 할 수 있습니다.

0

코드가 밀접하게 결합되지 않도록 알림과 함께 갈 것입니다.

관련 문제