Я столкнулся со странной проблемой при работе с 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
появляется только один раз?