NSNotification Observer, добавленный в viewWillAppear, выполняется дважды в iOS 13 - PullRequest
0 голосов
/ 30 октября 2019

Я столкнулся со странной проблемой при работе с NSNotification iOS 13

// Adding the observer in viewWillAppear
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    ...
    NSLog(@"Adding observer");
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification) name:@"someNotification" object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    ...
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"someNotification" object:nil];
    NSLog(@"Removed observer");
}

- (void)handleNotification {
    NSLog(@"Handle notification");
}

Я дважды проверил, что уведомление отправляется только один раз . В приложении есть только одно место, где размещено someNotification и точка останова, а NSLog подтверждает, что этот код выполняется только один раз.

Результат в iOS 12 и ниже:

Adding observer
Handle notification

Результат в iOS 13 и ниже:

Adding observer
Handle notification
Handle notification

Так что в iOS 13 наблюдатель вызывается дважды, в то время как точно такой же код в iOS 12 и дуетвызывается только один раз.

Моим первым предположением было то, что по какой-то причине в iOS 13 viewWillAppear вызывается дважды, поэтому наблюдатель добавляется дважды. Однако в этом случае NSLog вывод Adding Observer также должен появиться дважды, не так ли?

НО: Проблема может быть решена удалениемнаблюдатель в viewWillAppear перед его добавлением. Это гарантирует, что наблюдатель добавляется только один раз:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    ...
    NSLog(@"Adding observer");
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"someNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification) name:@"someNotification" object:nil];
}

Итак, поскольку это решает проблему, наблюдатель, очевидно, добавляется дважды в viewWillAppear. Но почему?

Почему viewWillAppear вызывается дважды в iOS 13? И что еще важнее: как это возможно, что он вызывается дважды, а NSLog output Adding Observer появляется только один раз?

...