在我的许多UIViewControllers
中,我根据数据状态更新了某些控件。例如,我可能在UITableViewController
上有一个编辑按钮,只有在有一个或多个项目时才能启用该按钮。或者我想限制可以添加的项目数量,否则禁用“添加”按钮。
每次添加或删除项目(或采取任何其他可以添加/删除项目的操作)时,我都必须记住更新可能需要启用/禁用的任何控件。这在很大程度上是微不足道的,但是感觉不舒服 - 有很多重复,每当我添加可能影响到的新功能时,我必须记住将调用添加到updateControlEnabled
(或其他)数据
然后我注意到NSManagedObjectContextObjectsDidChangeNotification。阅读文档,看起来我可以在托管对象上下文中发生更改时收到通知。这似乎很理想,但我有几个问题:
这是否合适? NSManagedObjectContextObjectsDidChangeNotification?
如果控制器,我是否应该预期会对性能产生任何影响 订阅这些并解析每一个以查看是否需要更新 用户界面?我将检查userInfo的每个更改,而不是 只有那些我知道我会关心的。
UIViewController
有一个
参考上下文,这有帮助,但我不知道在哪里
订阅(loadView?viewDidLoad?init?)这样的视图
控制器将始终只有一个订阅。我想我大多只是想知道是否有其他人使用这种方法,如果有的话,他们的经验是什么。
答案 0 :(得分:2)
问)这是否适当使用NSManagedObjectContextObjectsDidChangeNotification?
A)是的 - 我在OSX上使用它是出于类似的目的。
问:如果控制器订阅了这些并解析每一个以查看是否需要更新UI,我是否应该预计会对性能产生什么影响?我将检查userInfo的每个更改,而不仅仅是我知道我会关心的那些。
A)不 - 它通常是一组非常小的物体 - 直接改变的物体。
问)我应该在哪里订阅通知?我的UIViewController有一个对上下文的引用,这有帮助,但我不知道在哪里订阅(loadView?viewDidLoad?init?),这样视图控制器将始终只有一个订阅。
A)嗯,你不能影响UI直到视图显示 - 所以可能是viewDidLoad或viewWillAppear。后者的问题是你可能会有几次取决于推/弹,所以也许我会在viewDidLoad中这样做。
Q)视图控制器将在屏幕外时继续接收和处理通知 - 启用和禁用控件,因为数据模型会受到其他地方的影响。这可以吗?
A)当然 - 当视图重新出现时,所有元素都将正确设置。
您要做的是对该通知的经典使用。只需检查它所带来的线程 - 如果它不是mainThread,那么你想要将一个块中的所有更改发布到mainThread。