3

在我的许多 中UIViewControllers,我会根据我的数据状态更新某些控件。例如,我可能有一个编辑按钮UITableViewController,只有在有一个或多个项目时才应该启用。或者也许我想限制可以添加的项目数量,否则禁用“添加”按钮。

每次我添加或删除一个项目(或采取任何其他可以添加/删除项目的操作)时,我都必须记住更新任何可能需要启用/禁用的控件。这在大多数情况下是微不足道的,但感觉不舒服 - 有很多重复,我必须记住在添加updateControlEnabled可能影响数据的新功能时添加调用(或其他)。

然后我注意到 NSManagedObjectContextObjectsDidChangeNotification。阅读文档,我似乎可以在托管对象上下文发生变化时收到通知。这似乎很理想,但我有几个问题:

  1. 这是对 NSManagedObjectContextObjectsDidChangeNotification 的适当使用吗?

  2. 如果控制器订阅这些并解析每一个以查看它是否需要更新 UI,我是否应该预期任何性能影响?我将检查 userInfo 的每一项更改,而不是只检查那些我知道我会关心的更改。

  3. 我应该在哪里订阅通知?我UIViewController有一个对上下文的引用,这有帮助,但我不知道在哪里订阅(loadView?viewDidLoad?init?),这样视图控制器将始终只有一个订阅。
  4. 视图控制器在屏幕外时将继续接收和处理通知 - 当数据模型受到其他地方的影响时启用和禁用控件。这个可以吗?

我想我主要是想知道是否还有其他人使用这种方法,如果是,他们的经验是什么。

4

1 回答 1

2

问)这是对 NSManagedObjectContextObjectsDidChangeNotification 的适当使用吗?

A) 是的 - 我在 OSX 上使用它用于类似的目的。

问)如果控制器订阅这些并解析每一个以查看是否需要更新 UI,我是否应该预期任何性能影响?我将检查 userInfo 的每一项更改,而不是只检查那些我知道我会关心的更改。

A) 否 - 它通常是一组非常小的对象 - 直接更改的对象。

Q) 我应该在哪里订阅通知?我的 UIViewController 有对上下文的引用,这有帮助,但我不知道在哪里订阅(loadView?viewDidLoad?init?),这样视图控制器将始终只有一个订阅。

A) 好吧,在视图显示之前你不能影响 UI - 所以可能是 viewDidLoad 或 viewWillAppear。后者的问题是您可能会根据推送/弹出次数获得几次,所以也许我会在 viewDidLoad 中进行。

Q) 视图控制器在屏幕外时将继续接收和处理通知 - 当数据模型受到其他地方的影响时,启用和禁用控件。这个可以吗?

A)当然 - 当视图重新出现时,所有元素都将正确设置。

您要做的是对该通知的经典用法。只需检查它所在的线程 - 如果它不是 mainThread,那么您想在发布到 mainThread 的块中进行所有更改。

于 2012-09-16T17:36:59.763 回答