3

让我解释。我有一个数据类,它只不过是 NSMutableArray 的一个实例。我添加了 currentItem 的属性。当我的应用程序启动时,会创建此类的一个实例,然后与多个视图控制器共享。

当这些视图控制器中的任何一个设置当前项目时 ([myClass setCurrentItem:(MyItem*)item] 我想通知所有视图控制器,以便他们可以更新他们的 UI 等......

我对实施解决方案的最佳方式感到矛盾。我可以:

1.) 使用自定义协议,让我的类通过添加方法 addDelegate:(id)instance 来跟踪委托集合,将委托集合保存在 NSMutableArray ivar 中,然后在设置 currentItem 时进行迭代和通信。

或者

2.) 设置 iVar 时,使用 NSNotification 中心进行通信。

就代表们而言,呼叫顺序对我来说并不重要。

哪种方法更适合这种情况?在我看来,选项 #1 会是更简洁的方法,但我对“多个代表”的搜索结果表明,当有多个代表时,我应该使用 NSNotification 中心,但背后没有太多理由。

你的意见是什么,为什么?

4

1 回答 1

1

我认为上面的评论总结了一些想法,但我只想添加一些想法:

当这些视图控制器中的任何一个设置当前项目时 ([myClass setCurrentItem:(MyItem*)item] 我想通知所有视图控制器,以便他们可以更新他们的 UI 等......

这意味着您正在更新所有 UIViewController,即使它们不可见。您没有说明您正在为哪个平台开发,但总的来说,我的目标是仅在绝对需要时更新控制器(即当它们对用户可见时)。在这种情况下,您可以选择将逻辑放入viewWillAppear:和/或viewDidAppear:检查您的模型(即NSMutableArray)并适当地更新视图。

现在,是使用 NSNotifications 还是使用协议方法和委托的问题是一个棘手的问题。我想有几点需要考虑:

  1. 您是否有一个拥有或管理您的班级的对象?通常,这适用于代表 -UITableView例如,认为。
  2. 您是否要确保单个对象必须实现事件方法 - 再次,协议可以确保实现方法并使文档清晰。

否则通知非常方便。查看标准框架并从中获取指导​​,但要意识到其中很多只是一个判断电话。例如,看一下UITextField- 它使用UITextFieldDelegate协议,但也创建通知。我敢肯定有一个很好的理由,但可能需要花一些时间考虑一下......

编辑:为了完整起见,正如您提到的:

2.) 设置 iVar 时,使用 NSNotification 中心进行通信。

Key-Value Observing (KVO) 允许您直接使用对象实例变量注册通知。

从 iOS 5.1 文档:

键值观察是一种机制,当另一个对象的属性发生变化时,可以直接通知一个对象。键值观察(或 KVO)可能是应用程序内聚性的重要因素。它是按照模型-视图-控制器设计模式设计的应用程序中对象之间的一种通信模式。例如,您可以使用它来将模型对象的状态与视图和控制器层中的对象同步。通常,控制器对象观察模型对象,视图观察控制器对象或模型对象。

我会添加指向文档的链接,但目前没有我的书签。

于 2012-07-24T10:31:16.130 回答