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

Ios 下载、保存到核心数据、获取和显示?或者下载、显示然后保存?,ios,swift,core-data,Ios,Swift,Core Data,我正在构建一个应用程序,它可以从WordPress博客站点获取帖子并显示在tableView上。每个表格视图单元格显示文章图像、标题和摘录文本。这是一个课程项目,需要使用核心数据。所以我的问题是,为了更好的用户体验,我应该在下载后直接在手机上显示图像,然后保存到商店,还是保存到商店,提取,然后显示 一些考虑: 当应用程序启动时,它将检查互联网连接,如果连接建立,商店将被清理,最新的帖子将被下载 它将一次下载5篇文章 向上滚动将执行旧帖子的下载 这是一个以意见为导向的问题。我所能做的就是让你知道

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

一些考虑:

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

  • 它将一次下载5篇文章

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

    • 这是一个以意见为导向的问题。我所能做的就是让你知道我过去是如何设计我的应用程序来处理这种情况的

      我的解决方案:

    • 使用
      NSFetchedResultsController
      从核心数据读取数据,并使用NSFetchedResultsController的
      fetchedObject
      数组作为
      UITableViewController
      UICollectionViewController

    • 实现
      NSFetchedResultsController
      的委托,当核心数据中的数据发生更改时将触发该委托。这样,您可以高效地更新
      集合视图
      表格视图
      ,并尽快在UI上显示数据更改

    • 使用后台上下文修改数据,这样您的主线程将是自由的,应用程序将保持响应

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

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

    • 记得我说的删除文件的相对路径不是绝对文件。因为在终止和重新启动应用程序时,应用程序文件夹/沙盒路径会发生更改。将文件的绝对路径保存在核心数据中是一个完美的方法,可以搞乱逻辑

    • 不要担心将数据保存到核心数据的延迟。延迟可能在几秒钟之内,你甚至不会注意到。将数据保存在数组中,然后从核心数据中提取数据并更新数组是完全不可能的

    • 就个人而言,使用数组来保存数据而不是NSFetchedResultsController的FetchedObject是完全不可能的。为什么?简单地说,数组不是线程安全的,因为您将使用后台线程进行web服务调用并解析数据,您可能有多个线程同时访问数组。因为数组不是线程安全的,所以您可能很容易进入数据不一致的状态,并可能导致崩溃

    • 最后,使用像SDWebImage这样的库来高效地加载图像。SDWebImage不仅可以加载图像,还可以通过快速加载图像在不同级别(RAM和硬盘中)缓存图像

    • 如果您计划使用分页来获取数据,请使用scrollView的委托
      scrollViewDidScroll
      来确定用户何时滚动到表/集合视图的底部,并在后台线程更新核心数据中进行web服务调用和获取数据。更新mainObjectContext后,NSFetchedResults控制器的委托将被触发,您应该能够立即更新UI


    • 我喜欢先展示,然后保存。保存不是一个便宜的操作,应该在后台队列中执行,所以我们不能等到它完成。感谢您的意见AkkiThanks为您的输入Sandeep。因此,基本上您要说的是先保存,不必担心保存/获取时间,只要我使用fetchResultsController来管理tableView数据源,它的结构确实会更好。我喜欢使用scrollViewDidScroll预取数据的想法。@steven taglohner:是的。这就是大多数支持离线的应用程序的工作原理。每次ur应用程序启动视图控制器时,只需从VC的核心数据中读取数据,数据源始终是NSFetchedResultsController。因此,每次用户调用您的应用程序时,您都会有数据显示。同时,您可以在后台调用以获取更新的数据、解析和更新核心数据。一旦Coredata得到更新,您将收到代表的通知,并且您将能够更新UI并显示新数据,而不会遇到麻烦。我见过的大多数应用程序都使用这种方法