В C ++ нетрудно добавить Observer для уведомления. Но проблема в том, как я могу удалить Обозреватель.
[[NSNotificationCenter defaultCenter] addObserverForName:@"SENTENCE_FOUND" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
Так что обычно мы используем
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"SENTENCE_FOUND" object:nil];
удалить наблюдателя.
Но так как C ++ не имеет self
и когда я использую this
Я получил следующую ошибку
Cannot initialize a parameter of type 'id _Nonnull' with an rvalue of type 'DialogSystem *'
Так, как я мог удалить наблюдателя класса C ++? Или это невозможно?
Скопировано из документация из -[NSNotificationCenter addObserverForName:object:queue:usingBlock:]
:
Возвращаемое значение
Непрозрачный объект, чтобы действовать в качестве наблюдателя.
обсуждение
Если данное уведомление запускает более одного блока-наблюдателя, все блоки могут выполняться одновременно по отношению друг к другу (но в их данной очереди или в текущем потоке).
В следующем примере показано, как можно зарегистрироваться для получения уведомлений об изменении локали.
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
self.localeChangeObserver = [center addObserverForName:NSCurrentLocaleDidChangeNotification object:nil
queue:mainQueue usingBlock:^(NSNotification *note) {
NSLog(@"The user's locale changed to: %@", [[NSLocale currentLocale] localeIdentifier]);
}];
Чтобы отменить регистрацию наблюдений, вы передаете объект, возвращенный этим методом, в removeObserver :. Вы должны вызвать removeObserver: или removeObserver: name: object: до того, как какой-либо объект, указанный в addObserverForName: object: queue: usingBlock: будет освобожден.
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center removeObserver:self.localeChangeObserver];
Редактировать: Скопировано с той же страницы:
Другим распространенным шаблоном является создание одноразового уведомления путем удаления наблюдателя из блока наблюдения, как в следующем примере.
NSNotificationCenter * __weak center = [NSNotificationCenter defaultCenter];
id __block token = [center addObserverForName:@"OneTimeNotification"object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
NSLog(@"Received the notification!");
[center removeObserver:token];
}];
Других решений пока нет …