使用NSManagedObjectContextObjectsDidChangeNotification

时间:2012-09-16 16:53:16

标签: objective-c ios cocoa-touch nsmanagedobject nsmanagedobjectcontext

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

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

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

  1. 这是否合适? NSManagedObjectContextObjectsDidChangeNotification?

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

  3. 我应该在哪里订阅通知?我的UIViewController有一个 参考上下文,这有帮助,但我不知道在哪里 订阅(loadView?viewDidLoad?init?)这样的视图 控制器将始终只有一个订阅。
  4. 视图控制器将继续接收和处理通知 当它在屏幕外时 - 启用和禁用控件 数据模型受其他地方的影响。这样可以吗?
  5. 我想我大多只是想知道是否有其他人使用这种方法,如果有的话,他们的经验是什么。

1 个答案:

答案 0 :(得分:2)

问)这是否适当使用NSManagedObjectContextObjectsDidChangeNotification?

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

问:如果控制器订阅了这些并解析每一个以查看是否需要更新UI,我是否应该预计会对性能产生什么影响?我将检查userInfo的每个更改,而不仅仅是我知道我会关心的那些。

A)不 - 它通常是一组非常小的物体 - 直接改变的物体。

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

A)嗯,你不能影响UI直到视图显示 - 所以可能是viewDidLoad或viewWillAppear。后者的问题是你可能会有几次取决于推/弹,所以也许我会在viewDidLoad中这样做。

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

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

您要做的是对该通知的经典使用。只需检查它所带来的线程 - 如果它不是mainThread,那么你想要将一个块中的所有更改发布到mainThread。