我们应该在哪里发送更新许多视图的通知?

时间:2010-05-21 08:54:33

标签: iphone design-patterns

我想问一下软件设计。 我有一个任务,视图控制器处理UI事件以调用模型管理器来执行该任务。完成后,模型管理器将回调以更新视图。

还有其他视图控制器关心该任务,并且还希望在该任务完成时更新自己的视图。所以我在每个视图控制器中为该任务注册了一个通知。

问题在于定义应该在模型管理器或处理事件的视图控制器中发送“完成任务”通知的位置,并从模型管理器接收回调? 什么是更好的设计?模型是否应该关心发送这个“常见”任务,还是应该是视图控制器?

我认为最好选择View控制器,但我的朋友说视图控制器不应该关心其他视图控制器。

由于

3 个答案:

答案 0 :(得分:2)

根据您的描述,模型看起来知道任务何时完成,因此模型应负责生成该通知。

问题在于定义应该在模型管理器或处理事件的视图控制器中发送“完成任务”通知的位置,并从模型管理器接收回调

我不明白你的意思。通过NSNotificationCenter使用通知的全部目的是将发送者与接收者分离。该模型只是向通知中心发布消息,感兴趣的订阅者将通过通知中心收到消息。视图控制器不需要直接与模型管理器交互。

这是一个可能的工作流程:

在应用程序启动时:

1. View Controller 1 subscribes to "onTaskFinished" message at NotificationCenter
2. View Controller 2 subscribes to "onTaskFinished" message at NotificationCenter
3. User presses "Perform Task" button in some view controller
4. Model Manager gets triggered and performs the task
5. Model Manager publishes "onTaskFinished" message to NotificationCenter

View Controller是发送此消息的不错选择,因为它将视图控制器耦合在一起,并且应用程序的正常运行取决于此视图控制器的正常运行。

考虑这个视图控制器被卸载的情况,因为它占用了太多内存。现在其他视图控制器将不会收到“任务已完成”通知,因为视图控制器负责不再在内存中发送此通知,并且显然没有收听通知。

答案 1 :(得分:0)

首先了解核心数据。

否则: 在模型管理器执行其任务后,让视图控制器调用[view setNeedsDisplay]。这将强制所有视图/表等重绘自己,并且在此过程中,他们应该从数据模型中检索信息并显示其当前内容。

答案 2 :(得分:-1)

您可以向NSNotificationCenter的实例发送通知,如下所示:

// after completing the task 
[[NSNotificationCenter defaultCenter] postNotificationName:@"noteName" object:self userInfo:optionalDic];

在发送之前,您的观点或任何其他文件可以注册以接收通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someName:) name:@"noteName" object:notification sender];

当您发布通知时,将使用someName:实例作为参数调用您的对象的NSNotification方法。