1

我刚刚遇到了NSNotificationCentermethod[NSNotificationCenter defaultCenter] addObserverForName: object: queue: usingBlock:方法,因为我开始习惯使用块,所以我决定尝试一下,因为这样可以提高代码的可读性。

但由于某种原因,我无法让它工作。为什么这不起作用

[[NSNotificationCenter defaultCenter] addObserverForName:@"SomeNotificationName"
                                                  object:self
                                                   queue:[NSOperationQueue mainQueue]
                                              usingBlock:^(NSNotification *note) {

                                                  NSLog(@"This doesn't work");
                                                  // ... want to do awesome stuff here...

                                              }];

因为这工作得很好

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(aMethod)
                                             name:@"SomeNotificationName"
                                           object:nil];
//...
//....

- (void)aMethod {
    NSLog(@"This works");
    // ... doing awesome stuff here...
}

结束注
谢谢,以供将来参考,这是我的最终解决方案

// declared instance variable id _myObserver;
//...

_myObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"SomeNotificationName"
                                                                          object:nil
                                                                           queue:[NSOperationQueue mainQueue]
                                                                      usingBlock:^(NSNotification *note) {

                                                                          NSLog(@"It's working! It's working!!");
                                                                          // ... again doing awesome stuff here...

                                                                      }];

最后,(当我完成对象时)

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:_myObserver];
}
4

2 回答 2

5

仔细阅读文档 :) 在块版本中,您必须存储返回的“令牌”对象,例如在 ivar 中。

id obj = [[NSNotificationCenter defaultCenter]
                  addObserverForName:@"SomeNotificationName"
                              object:self
                               queue:[NSOperationQueue mainQueue]
                          usingBlock:^(NSNotification *note) {
                              NSLog(@"This doesn't work");
                              // ... want to do awesome stuff here...
                          }];
//you need to retain obj somehow (e.g. using ivar)
//otherwise it will get released on its own under ARC

另外(如文档中所述),完成后不要忘记删除观察者。就我而言,这通常发生在dealloc我的窗口/视图控制器的方法中。在你的情况下,它可能在不同的地方。(当然,如果您希望观察者直到您的应用退出,您不需要这样做。)

- (void)dealloc {      
  //assuming you stored it in _obj ivar
  [[NSNotificationCenter defaultCenter] removeObserver:_obj];

  //no super dealloc under ARC
}
于 2013-05-22T09:47:43.967 回答
1

两种方法中的object参数都是通知的发送者。

在基于块的您正在传递self,在基于选择器的您正在传递nil。这意味着基于块的观察者将只收听由self.

于 2013-05-22T10:05:44.553 回答