我正在开发一个从网络上获取数据并将其显示给用户的应用程序。假设数据是餐馆的评论,并且在一个视图上显示一个评论。用户可以向左或向右滑动以转到上一个/下一个评论。数据是异步提取的(每次审核都有一个帖子)。
以下是问题陈述 - 假设已经提取了5条评论,并且用户正在查看当前的第3条评论。现在,提取第6次审核,我想将其显示为用户的第4次审核(因为第6次审核的发布日期比第5次审核更新)。我的模型类应该如何通知视图控制器?
我考虑过一些选择 -
在这种情况下是否采用了既定的设计模式?除上述3之外的其他建议值得欢迎!
答案 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 ...”消息,直到它们完全在内存中)。
答案 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];
}