2017-09-02 61 views
2

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

一些注意事项:

  • 时,应用程序启动,它会检查网络连接

    ,如果连接建立,商店将被清理和最新的职位将被下载。

  • 它会下载5个帖子在时间

  • 向上滚动将执行旧文章的下载。
+0

我喜欢先放映,然后保存。保存不是廉价的操作,应该在后台队列中执行,所以我们不能等到它完成。 – Akki

+0

感谢您的意见Akki –

回答

1

这是一个面向观点问题。我能做的最好的事情就是让你知道我过去如何设计我的应用程序来处理这种情况。

我的解决办法:

  1. 使用NSFetchedResultsController来读取核心数据的数据,并使用NSFetchedResultsController的fetchedObjects阵列作为数据源到您的UITableViewControllerUICollectionViewController

  2. 实施的NSFetchedResultsController代表这将Core数据中的数据更改时触发。这样你可以有效地更新你的CollectionViewTableView并在UI ASAP上显示数据变化。

  3. 使用背景上下文来修改数据的方式你的主线程将是免费的应用保持响应。

  4. 为了创建背景情况下,我更喜欢父子背景架构,而不是传统的多语境架构。亲子上下文架构很容易理解,保持代码清洁。

  5. 切勿将图像保存到核心数据中。而是将下载的图像保存到文档目录,并将相关链接保存到CoreData中的下载文件中。

  6. 还记得我说过要删除的文件不是绝对的文件相对路径。因为您的应用程序文件夹/沙箱路径在杀死和重新启动应用程序时发生变化。在核心数据中保存文件的绝对路径是彻底解决逻辑问题的好办法。

  7. 不要担心在数据保存到核心数据的延迟。延迟可能只有几秒钟,你甚至不会注意到。将数据保存在一个数组中,然后从核心数据中获取数据并更新数组是一个完整的no。

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

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

  10. 如果你打算使用分页来获取数据,使用scrollViewDidScroll滚动视图的委托,当用户滚动找出表/的CollectionView的底部,使Web服务调用,并获取在后台线程更新的核心数据。只要更新mainObjectContext,NSFetchedResults控制器的委托将被触发,并且您应该能够立即更新UI。

+1

感谢您的输入Sandeep。所以基本上你说的是先保存并且不用担心保存/获取时间,只要我使用fetchResultsController来管理tableView数据源,它听起来会更好一些。我喜欢使用scrollViewDidScroll预取数据的想法。 –

+0

@ steven-taglohner:的确如此。这是大多数具有脱机支持的应用程序的工作原理。每次你的应用程序启动你的视图控制器只是从核心数据读取数据对于你的VC数据源总是NSFetchedResultsController。因此,每当用户调用您的应用程序时,您都会始终显示数据。意思是你可以在后台拨打电话来获取更新的数据,解析和更新核心数据。只要Coredata得到更新,您将会收到代表的通知,并且能够更新UI并显示新数据,而不用麻烦。我看过的大多数应用程序都使用这种方法 –

相关问题