iOS:用于填充异步提取数据的设计模式

时间:2014-02-25 06:27:29

标签: ios design-patterns asynchronous nsnotifications nsfetchedresultscontroller

我正在开发一个从网络上获取数据并将其显示给用户的应用程序。假设数据是餐馆的评论,并且在一个视图上显示一个评论。用户可以向左或向右滑动以转到上一个/下一个评论。数据是异步提取的(每次审核都有一个帖子)。

以下是问题陈述 - 假设已经提取了5条评论,并且用户正在查看当前的第3条评论。现在,提取第6次审核,我想将其显示为用户的第4次审核(因为第6次审核的发布日期比第5次审核更新)。我的模型类应该如何通知视图控制器?

我考虑过一些选择 -

  1. 向视图控制器提供一个数组,然后发送有关要在特定索引处插入数组之间的新项目的NSNotifications
  2. 使用NSFetchedResultsController(这有点棘手,因为我没有将它与表视图控制器一起使用)
  3. 视图控制器总是要求显示下一个评论(来自模型),并且没有一系列评论
  4. 在这种情况下是否采用了既定的设计模式?除上述3之外的其他建议值得欢迎!

4 个答案:

答案 0 :(得分:7)

只需使用NSFetchedResultsController即可。使用NSIndexPath时,请忽略section。它基本上是一个美化的NSArray,提供免费通知。

以下是我认为我会这样做的方式:

  • 确保NSFetchRequest的{​​{1}}按发布日期排序。
  • 处理NSFetchedResultsController方法。
  • NSFetchedResultsControllerDelegate更新时,保存当前对象,重新加载集合视图,然后滚动到保存的对象而不进行任何动画。这对用户来说就好像当前页面没有发生任何事情一样。

答案 1 :(得分:1)

虽然每个编程问题都没有完美的设计模式,但我能想到的最接近你问题的是命令和观察者模式的组合。

https://en.wikipedia.org/wiki/Command_pattern

观察者模式用于NSNotification中心。

虽然不清楚为什么要跳过评论,但是在获取时可以有两个数组来存储它们。第一个包含您提取的所有评论。第二个包含所有显示的评论。

然后你可以在fetched数组中获得最后的评论,就像它是一个堆栈一样。这样,您始终会将最后一个加载显示给用户。

答案 2 :(得分:1)

我很困惑为什么显示的顺序与真正的顺序不同,即为什么第6次审核在第5次之前出现,但是您询问了有关模式的帮助。

除了MVC和观察者,在其他答案和评论中,我建议使用延迟加载virtual proxy。获取评论后,您只需显示其代理(例如,使用“loading ...”消息,直到它们完全在内存中)。

在此处查看更多内容:http://en.wikipedia.org/wiki/Proxy_pattern

答案 3 :(得分:1)

我建议使用观察模式通知您的控制器,而不是获取的新数据。当接收到信号时,您的视图控制器可以更新其“餐厅评论”数组(通过添加旧视图并根据您的风格的某些排序描述符或通过直接查询DAO重新排序)。 假设您从Internet获取数据并使用结果填充CoreData实体。获得下载的数据后,您可以填充核心数据“审核”实体。 为了“监听”核心数据发生的变化,你的控制器应该在viewDidLoad体中将自己注册为NSManagedObjectContextDidSaveNotification的观察者。

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateInfo:) name:NSManagedObjectContextDidSaveNotification object:nil];

然后在您的updateInfo中,您可以获得更改

- (void) updateInfo:(NSNotification *)notification { self.reviews = [self.managedObjectContext performRequest:myFetchRequest error:nil]; }