2013-02-13 2 views
0

이상한 문제가 있습니다. ViewController.m에서 성공적인 저장 후 알림을 게시하고 Segue를 ListViewController으로 수행합니다. ListViewController.m에는 observer를 viewDidLoad에 설정하고 처리 방법을 선언합니다.NSNotification 처리기 메서드 내에서 코드가 실행되지 않아도 메서드가 제대로 호출됩니다.

문제는 핸들러 메소드가 호출되었지만 내부에서 코드가 실행되지 않는다는 것입니다. 왜 그런가?

// ViewController.m 
if (success) { 
    [[NSNotificationCenter defaultCenter] postNotificationName:kAHPlistSavedSuccessfully object:self]; 
    [self performSegueWithIdentifier:kAHDetailToListSegue sender:self]; 
} 

// ListViewController.m 
- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plistSavedSuccessfully:) name:kAHPlistSavedSuccessfully object:nil]; 
} 

- (void)plistSavedSuccessfully:(NSNotification *)notification 
{ 
    NSLog(@"notification %@", notification); 
    [self someMethod]; // not called ! 
} 
+0

이것은 plistSavedSuccessfully의 로그 메시지입니다. notif = NSConcreteNotification 0x1f5406f0 {name = plistSavedSuccessfully; object = } – alexhajdu

+0

NSLog를 출력하고 있다면'someMethod'도 실행해야합니다. 'someMethod'는 무엇입니까? 그 안에 NSLog를 추가하고 확인해 보셨습니까? – iDev

+0

@ACB 예, someMethod의 NSLog가 작동하지만 ListViewController 콘센트를 수정하려고하면 작동하지 않습니다. – alexhajdu

답변

1

내가 잘못한 부분을 발견 할 수 있습니다.

먼저 목록보기 컨트롤러에 세그먼트를 수행하기 전에 알림을 게시하므로 목록보기 컨트롤러가 알림의 관찰자로 추가되기 전에 알림이 게시 될 수 있습니다. (로그 문이 인쇄 중이기는하지만, 어떤 경우에는 여전히 가능합니다.)

두 번째로 알림은 게시 된 큐와 동일한 큐에서 수신된다는 것입니다. 게시물 알림 코드가 다른 대기열에서 기본 대기열로 호출 될 수 있습니까? someMethod이 스레드 안전하지 않은 코드로 작업 할 경우 문제가 발생할 수 있습니다. 게시 통지 코드가 호출 된 대기열을 확인하고 대기열 또는 처리기에서 호출되었는지 확인하고 에 대한 호출을 dispatch_async을 사용하여 기본 대기열로 보냅니다.

+0

예, 문제는 순서대로였습니다 - 이전에는 알려지지 않았습니다. 감사 Jasarien! – alexhajdu

+0

문제가 지속됩니다 ... 내 notif가 두 번 호출되고 사용자 인터페이스 업데이트가 작동하지 않습니다 : / – alexhajdu

관련 문제