iOS最佳实践 - 更新父视图集合中的对象

时间:2014-02-21 19:48:56

标签: ios design-patterns

我想知道你对最佳方法的看法。

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

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

我的问题是如何更新EventsController中更改的事件而不转到后端。 请注意,两个控制器都在导航控制器内。

  1. 在segue期间将选定的事件对象传递给细节控制器 正如现在所做的那样。成功响应后的详细控制器 从后端更新此事件对象。所以实际上是对象 在EventsController中的事件数组中将更新。 EventsController可以触发表的重载 viewWillAppear等更改将在用户时反映出来 导航回EventsController。
  2. 使用protocol / delegate方法让EventsController知道 事件被跟踪或取消跟随。
    • 一个。在调用协议方法的EventsController中,查找事件(它们具有唯一的id 数组中的属性),更新它并重新加载表。
    • 湾或者在EventsController中不仅维护一个事件数组而且还维护一个 字典(键将是事件id,值将是索引 在events数组中的对象)调用协议方法,它可以看 在阵列中更快地找到事件并更新它。并致电 重装表。
  3. 你会使用当前的方法,1,2a或2.b?感谢。

1 个答案:

答案 0 :(得分:1)

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

一旦你以这种方式分离出模型,你就会发现从应用程序的任何地方进行重新加载,从网络服务重新加载,保存事件,修改事件等等都很容易。