下载,保存到核心数据,获取和显示?或者下载,显示然后保存?

时间:2017-09-02 15:16:51

标签: ios swift core-data

我正在构建一个应用程序,从WordPress博客网站获取帖子并显示在tableView上。每个表格视图单元格显示帖子图像,标题和摘录文本。这是一个课程项目,需要使用核心数据。所以我的问题是,为了获得更好的用户体验,我应该在下载后直接在单元格上显示图像,然后保存到商店,还是应该保存到商店,获取,然后显示?

一些注意事项:

  • 当应用程序启动时,它将检查互联网连接,如果建立连接,将清理商店并下载最新的帖子。

  • 一次下载5个帖子

  • 向上滚动将执行旧帖子的下载。

1 个答案:

答案 0 :(得分:1)

这是一个以意见为导向的问题。我能做的最好的事情就是让你知道我如何设计我的应用来处理这个案例。

我的解决方案:

  1. 使用NSFetchedResultsController从核心数据中读取数据,并使用NSFetchedResultsController的fetchedObjects数组作为UITableViewControllerUICollectionViewController的数据源

  2. 实现NSFetchedResultsController的委托,当核心数据中的数据发生变化时,委托将被触发。这样,您就可以有效地更新CollectionViewTableView并尽快在UI上显示数据更改。

  3. 使用背景上下文修改数据,使主线程免费,应用程序保持响应。

  4. 为了创建背景上下文,我更喜欢父子上下文架构而不是传统的多上下文架构。父子上下文体系结构易于理解,保持代码清洁。

  5. 永远不要将图像保存到核心数据中。而是将下载的图像保存到文档目录,并保存CoreData中下载文件的相对链接。

  6. 记得我说删除文件的相对路径不是绝对文件。因为您的应用程序文件夹/沙箱路径会在杀死并重新启动应用程序时发生更改。在核心数据中保存文件的绝对路径是搞乱逻辑的完美方法。

  7. 不要担心将数据保存到核心数据的延迟。延迟可能是你赢得甚至没有注意到的秒的一小部分。将数据保存在数组中,然后从核心数据中获取数据并更新数组是完全没有。

  8. 就个人而言,使用数组来保存数据而不是NSFetchedResultsController的fetchedObjects是一个完整的NO。为什么?简单,Array不是线程安全的,因为您将后台线程进行Web服务调用并解析数据,您可能有多个线程同时访问Array。由于Array不是线程安全的,因此您可能很容易陷入数据不一致的状态,并可能导致崩溃。

  9. 最后使用像SDWebImage这样的库来高效加载图像。 SDWebImage不仅可以加载图像,还可以通过快速,快速地加载图像,在各种级别(在RAM和HardDisk中)缓存它们。

  10. 如果您打算使用分页来获取数据,请使用scrollView的scrollViewDidScroll委托来确定用户何时滚动到表/ collectionView的底部并进行Web服务调用和获取后台线程中的数据更新核心数据。一旦更新mainObjectContext,NSFetchedResults将触发控制器的委托,您应该能够立即更新UI。