2013-10-08 1 views
0

Это странная ошибка накопления, которая несколько раз подталкивает мои VC на Nav VC.Один NSNotification отправлен, но многие селекторы называются

У меня есть UINavigationController с rootViewController, установленным в CWLandingVC (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]; 
... 
} 

На LVC, пользователь входит в систему, и когда мой класс APIClient получает успешный ответ сервера он отправляет уведомление:

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

В НОП прослушивает это и посылает этот селектор соответственно:

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 руда - которую я проверяю с помощью NSLog (@ «Уведомление о проводке для sessionArrived»); - но селектор toPagebookWorkspace вызывается дважды. Если я повторяю ошибку, селектор вызывается 3 раза и т. Д. Поэтому каждый раз, когда я повторяю ошибку, все больше и больше wvc нажимаются друг на друга в UINavigationController.

Возможно, эти журналы могут помочь осветить странную последовательность накапливания, которую я вижу. Для каждого сообщения уведомления APIClient я получаю все большее число pushViewController: wvc, а не только 1 push.

 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

Попробуйте выйти из системы, когда вы добавите наблюдателя, и сделайте уверен, что он не добавляется несколько раз. – danielbeard

+0

Хорошо, но зачем мне туда выходить? Это точно в момент, когда пользователь успешно вошел в систему. Вся цель наблюдателя заключается в том, чтобы поймать, когда сервер ответил проверенными учетными данными. – roro

+0

У меня есть еще один наблюдатель чуть ниже, но это слушает что-то другое: [центр addObserver: самостоятельно селектор: @selector (noWifiUserNotification) Имя: @ «failedRequestGeneral» объекта: клиент]; – roro

ответ

0

Ожидаемое поведение NSNotificationCenter: любой объект может добавлять несколько наблюдателей, даже для одного и того же имени, объекта и селектора. Если вы не хотите, чтобы ваш селектор называется несколько раз (и это не кажется, что вы делаете), делать инверсию addObserver: по телефону:

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

(Важное примечание: сделать НЕ вызов [[NSNotificationCenter defaultCenter] removeObserver:self] , так как это приведет к тому, что ваш объект потеряет наблюдение за всеми уведомлениями, которые его суперкласс (ы), возможно, зарегистрировал. См. this link для получения дополнительной информации о том, почему это ошибка.)

+0

Спасибо, что сделал! Я добавил ваш предложенный код в toPagebookWorkspace, и теперь он не получает вызов более одного раза за уведомление. Тем не менее, я до сих пор не понимаю, почему его вызывали несколько раз. Есть ли другие мысли? – roro

+0

Если вы добавляли наблюдателя-наблюдателя при каждом входе пользователя в систему, но не удаляли этого наблюдателя, когда пользователь выходит из системы, а затем выходить из системы и несколько раз в одном запуске приложения будут накапливать наблюдателей. – cbowns

 Смежные вопросы

  • Нет связанных вопросов^_^