цель c — удалить наблюдателя C ++ из NSNotification?

В 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 ++? Или это невозможно?

0

Решение

Скопировано из документация из -[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];
}];
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]