2014-02-21 55 views
0

我想知道您的意见是什么是最好的方法来做到这一点。iOS最佳实践 - 更新父视图集合中的对象

我有一个视图控制器(EventsController)与UITableView。它从后端应用程序获取事件数据并将它们存储在实例变量events(NSArray)中。它使用events数组填充表视图。

当用户点击表格中的某一行时,它们被带到另一个视图控制器(EventDetailController)。在segue期间,EventDetailController传递选定的事件对象。 细节控制器让用户关注或取消关注此事件。当用户关注/取消关注将信息发送到后端的事件时。目前在从后端接收到成功响应之后,详细控制器发布通知,让观察员知道事件发生了变化。 EventsController观察此通知,并在获取通知时重新加载自身(从后端获取所有事件并重新加载表)。我认为这是过度的(顺便说一下,这个通知也被EventsController以外的视图使用,我认为这就是为什么他们会使用通知而不是协议/委托)。

我的问题是关于如何在EventsController中更新已更改的事件而不需要到后端。 请注意,两个控制器均位于导航控制器内。

  1. 在segue期间,将所选事件对象传递到详细控制器 ,正如现在所做的那样。来自后端的成功响应 的详细控制器更新这个非常事件对象。所以事实上,EventsController中事件数组中的对象 将被更新。 EventsController可以在 viewWillAppear中触发表格的重新加载,并且当用户 导航回到EventsController时,反映将会反映出来。
  2. 使用协议/委托方法让EventsController知道 事件被关注或取消关注。
    • a。在调用协议方法的EventsController中,查找数组中的事件(它们具有唯一的ID 属性),更新它并重新加载表。
    • b。或者在EventsController中不仅维护一个事件数组,而且还维护一个字典(键将事件ID和值将是该事件数组中的 对象的索引)协议方法被调用,它可以查看 上找到事件更快在数组中并更新它。并致电 重新加载表。

你会用哪种当前方法,1,2.A或2.B?谢谢。

回答

1

我会将事件分成模型类。你可以在EventsController中实例化它,并通过一个属性将它传递给EventDetailController,或者你可以让它成为整个应用程序可以访问的单例。在事件详细信息中更改事件时,只需在EventModel类中更新事件,然后让模型类广播通知,或仅通过KVO观察事件数组。 (只是一个警告:如果你为事件数组使用了一个可变数组,那么改变集合中的一个对象不会触发KVO通知,你必须替换数组来获得自动注释。)

通过这种方式将模型分离出来后,您会发现从网络服务中重新加载,保存事件,修改事件等任何事情都非常容易。

+0

啊,这是一个很好的解决方案。当你说模型时,你不一定是核心数据,是吗?该模型可以是一个单数表示所有事件的数组? EventsController可以将选定的事件索引传递给细节控制器。 – septerr

+0

不需要核心数据。只是一个具有一系列事件的类,您可以根据需要修改/观察事件。 – jsd