2013-10-08 1 views
0

입니다. 이것은 내 VC를 탐색 VC에 여러 번 밀어 넣는 이상한 누적 버그입니다.하나의 NSNotification이 전송되었지만 많은 선택자가

rootViewController가 CWLandingVC (lvc)로 설정된 UINavigationController가 있습니다. LVC에

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    CWLandingVC *lvc = [[CWLandingVC alloc] init]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:lvc]; 
... 
} 

, 사용자가 로그인 내 APIClient 클래스는 성공적인 서버 응답을 얻을 때 알림 게시물 : 이것에 대한

 NSNotification* notification = [NSNotification notificationWithName:@"sessionArrived" object:self]; 
    NSLog(@"APIClient Posting notification for sessionArrived"); 
    [[NSNotificationCenter defaultCenter] postNotification:notification]; 

LVC 수신 대기하고 그에 따라이 셀렉터를 보냅니다

NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
[center addObserver:self 
      selector:@selector(toPagebookWorkspace) 
       name:@"sessionArrived" 
      object:client]; 
... 
- (void)toPagebookWorkspace { 
NSLog(@"lvc Calling toPagebookWorkspace for session %@. Opening PagebookWorkspace view.", [self sessionId]); 
CWWorkspaceVCViewController *wvc = [[CWWorkspaceVCViewController alloc] init]; 
[[self navigationController] pushViewController:wvc animated:YES]; 
} 

사용자가 로그인 할 때 버그가 발생하고 pushViewController : wvc를 성공적으로 수행하고 lvc에 다시 로그하고 다시 로그인합니다. 이렇게하면 알림이 m 번 게시됩니다. ore - NSLog (@ "sessionArrived 게시 공지")로 확인합니다. - 그러나 선택기 toPagebookWorkspace가 두 번 호출됩니다. 버그를 반복하면 선택기가 3 번 호출됩니다. 그래서 내가 버그를 repro 때마다 점점 더 많은 wvc의 UINavigationController에서 서로 위에 밀어 얻을.

아마도 이러한 로그는 내가 본 이상한 축적 시퀀스를 밝히는 데 도움이 될 수 있습니다. 각 APIClient 알림 게시물에 대해, pushViewController : wvc가 점점 증가하고 있습니다.

 Logging in... 
    APIClient Posting notifcation for sessionArrived 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    Pressed back on nav bar, calling viewWillDisappear 


    Logging in... 
    APIClient Posting notifcation for sessionArrived 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    nested push animation can result in corrupted navigation bar 
    Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
    Unbalanced calls to begin/end appearance transitions for <CWWorkspaceVCViewController: 0x8067410>. 
    Pressed back on nav bar, calling viewWillDisappear 
    Pressed back on nav bar, calling viewWillDisappear 


    Logging in... 
    APIClient Posting notifcation for sessionArrived 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    nested push animation can result in corrupted navigation bar 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    nested push animation can result in corrupted navigation bar 
    Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
    Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
    Unbalanced calls to begin/end appearance transitions for <CWWorkspaceVCViewController: 0x8068330>. 
    Pressed back on nav bar, calling viewWillDisappear 
    Pressed back on nav bar, calling viewWillDisappear 
    Pressed back on nav bar, calling viewWillDisappear 


    Logging in... 
    APIClient Posting notifcation for sessionArrived 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    nested push animation can result in corrupted navigation bar 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    nested push animation can result in corrupted navigation bar 
    lvc Calling toPagebookWorkspace for session lvcke2. Opening PagebookWorkspace view. 
    nested push animation can result in corrupted navigation bar 
    Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
    Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
    Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
    Unbalanced calls to begin/end appearance transitions for <CWWorkspaceVCViewController: 0x7257930>. 
    Pressed back on nav bar, calling viewWillDisappear 
    Pressed back on nav bar, calling viewWillDisappear 
    Pressed back on nav bar, calling viewWillDisappear 
    Pressed back on nav bar, calling viewWillDisappear 

무슨 일이 일어나고 있는지 미리 알 수 있다면 미리 도움을 청하십시오.

+0

옵저버를 추가 할 때 로그 아웃을 시도하고 make 그것이 여러 번 추가되지 않았는지 확인하십시오. – danielbeard

+0

좋아,하지만 왜 내가 거기에서 로그 아웃합니까? 사용자가 성공적으로 로그인 한 시점입니다. 관찰자의 전체 목적은 서버가 확인 된 로그인 자격 증명으로 응답 한 시점을 파악하는 것입니다. – roro

+0

난 그냥 그 아래 또 다른 관찰자가 수행하지만 다른 뭔가 듣고 있어요 : [중앙 addObserver : 자기 선택 : @selector (noWifiUserNotification) 이름 : 객체 "failedRequestGeneral"@ : 클라이언트] – roro

답변

0

예상되는 동작은 NSNotificationCenter입니다. 모든 개체는 동일한 이름, 개체 및 선택기에 대해서도 여러 개의 관찰자를 추가 할 수 있습니다.

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"sessionArrived" object:client]; 

(중요 참고 : 당신이 당신의 선택은 여러 번 호출하고 싶지 않아 (그리고 당신이하는 것처럼 보이지 않는다) 경우, 호출하여 addObserver:의 역을 하지 전화를 할 [[NSNotificationCenter defaultCenter] removeObserver:self]) 이것은 왜 당신의 객체가 슈퍼 클래스가 등록되었을지도 모르는 모든 통지에 대한 관찰을 잃게 될 것이기 때문입니다. (버그 이유에 대한 자세한 정보는 this link을 참조하십시오)

+0

고마워, 그랬어! 제안 된 코드를 toPagebookWorkspace에 추가했는데 이제 알림 당 두 번 이상 호출되지 않습니다. 그러나, 나는 왜 그것이 여러 번 전에 불려지는지 이해하지 못한다. 거기에 다른 생각? – roro

+0

사용자가 로그인 할 때마다 알림 센터 옵저버를 추가했지만 사용자가 로그 아웃 할 때 해당 옵저버를 제거하지 않으면 단일 응용 프로그램 실행에서 여러 번 로그 아웃하고 관찰자가 누적됩니다. – cbowns