在C ++中,为通知添加观察者并不难。但是问题是我如何删除观察者。

[[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:]documentation复制:


  返回值
  
  一个不透明的对象,充当观察者。
  
  讨论区
  
  如果给定的通知触发了一个以上的观察者块,则这些块可以相对于彼此并发执行(但可以在它们的给定队列或当前线程上执行)。
  
  以下示例显示了如何注册以接收区域设置更改通知。


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:。在释放由addObserverForName:object:queue:usingBlock:指定的任何对象之前,必须调用removeObserver:或removeObserver:name:object:。


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];
                                   }];

关于c++ - 从NSNotification删除C++观察者?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51715093/

10-12 12:42
查看更多