27

我以前addObserver在里面viewDidLoad:和里面removeObserverdealloc:代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshData)
                                                 name:AnyNotification
                                               object:nil];
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AnyNotification
                                                  object:nil];
}

但根据一些文章所说,最好是addObserverinviewDidAppear:removeObserverin viewDidDisappear:。代码:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshData)
                                                 name:AnyNotification
                                               object:nil];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AnyNotification
                                                  object:nil];
}

那么,添加观察者/删除观察者的更好方法是什么?

4

5 回答 5

25

这取决于您的场景,通常最好的方法是添加viewDidLoad和删除 indealloc和 in viewDidUnload(在 iOS 9.0 中已弃用,dealloc仅供使用),但在某些情况下,您在不同的类(如 UI 效果)中具有相同的方法并且只想调用当前屏幕使用通知的方法,那么您将必须添加观察者viewWillAppear并将其删除viewWillDisappearviewDidAppear/viewDidDisappear

编辑: 来自评论的注释,谢谢@honey。

虽然现在从 iOS 9 开始,您不再需要关心删除观察者。请参阅Apple 发布说明:“在 OS X 10.11 和 iOS 9.0 中,NSNotificationCenter 和 NSDistributedNotificationCenter 将不再向可能被释放的已注册观察者发送通知。.

于 2012-05-17T07:15:40.683 回答
4

我通常会将它放入-viewDidAppear:and -viewDidDisapear:(或-viewWillAppear:and -viewWillDisappear:)中,因为在我遇到的每种情况下,我只对实际显示视图的通知感兴趣。

这可能是一个过早的优化(您处理通知的代码可能需要一些时间,但如果视图未显示,则可能无用),但它也不再是代码 - 它是相同的代码,只是方法不同......

于 2012-05-17T07:21:00.330 回答
1

不要忘记 NSKeyValueObservingOptionInitial。我将它与 viewWillAppear/viewWillDisappear 一起使用,因此我的 UI 始终是最新的,即使我隐藏了该视图控制器,也节省了资源,因为在再次显示之前我不会更新它。

于 2015-09-05T11:21:55.363 回答
0

-viewWillAppear:+-viewWillDisappear:-viewDidAppear:+好-viewDidDisapear:,因为它们总是被调用相同的次数。

于 2016-05-19T06:32:04.767 回答
0

使用 NSNotifications 的最佳方法是在您需要观察通知时添加观察者,在不再需要它们时删除它们

这可能是 on viewDidLoad:viewWillAppear:,或者当用户点击某个按钮等时。

我给你举个小例子:

我的应用程序有一个标签栏,在一些视图控制器中,我正在显示一些从互联网下载的信息(例如一条推文)。我还有一个类池,每 2 分钟从服务器收集新数据,并且由于服务器有新数据,我更新了数据库信息。我不会使用委托模式来监听 DB 更改,因为我有很多视图控制器显示数据,将委托作为一个数组并循环为每个视图控制器传递数据将是一个非常糟糕的设计。因此,在这种特定情况下,最好的做法是发布通知,告诉每个 VC 新数据已经到来。

如果您的 VC 在视图消失时删除了代理,则只有当前的代理会收到通知并更新显示内容。

例如,您显然可以在显示之前更新其他 VC 的内容viewWillAppear:,但是这样做不仅会在必要时更新 VC 内容,而且每次更改选项卡时都会更新。

这只是一个示例,我试图向您展示对于 NSNotifications,当我们没有关于您的应用行为方式的完整描述时,很难建议您何时添加或删除观察者。

于 2016-05-19T07:18:13.510 回答