在保留所有下载数据的同时,在多个视图控制器之间切换的最佳方法是什么?

时间:2018-08-13 15:15:14

标签: ios swift

具有多个UIViewController的最佳方法是什么,这些UIViewController可以从侧面菜单访问,而不必在每次显示视图控制器时都重新下载任何数据?

例如,我有三个视图控制器,一个是显示最近通知的主页,一个是显示最近文章的新闻页面,一个是包含图像集合的页面。加载每个视图控制器后,将从远程服务器下载数据并显示-如果用户切换到另一个视图控制器,然后再次返回,则我希望立即显示以前下载的数据,而不必重新下载(直到UIRefreshControl为使用或类似)。

从头顶上我可以看到这是通过4种方式实现的:

  1. 将数据存储在单例中,如果先前已下载过,则从中加载数据,但是,这似乎违背了我所见过的通用惯例,而且似乎也不太有效-尤其是如果有很多数据和/或多视图控制器。
  2. 使用UITabBarController基于侧菜单而不是传统的底部栏来选择索引,如果侧菜单上有10-12个项目,这会引起问题吗?
  3. 将数据缓存到磁盘(使用NSCache等),并根据需要实例化/关闭每个视图控制器,该视图控制器可以使用缓存的数据-一次仅一个视图控制器将存在于内存中。
  4. 使用某种自定义的容器视图来缓存视图控制器并根据需要加载它们,感觉有些hacky,效率不是很高吗?

实现此目标的最佳方法是什么?我看到的大多数教程都只是展示了如何选择/呈现视图控制器,但我一直在努力寻找能够解释如何保存在其上下载的数据的任何内容。

2 个答案:

答案 0 :(得分:0)

我会结合使用选项3和4。

您可以使用多种格式将数据缓存到磁盘。您可以使用CoreData或Realm之类的数据库,也可以以Plist,JSON,NSKeyedArchive的形式直接写入文件。

您可能还应该构建一个容器视图控制器。那就是TabBarController到底是什么。这很容易做到,the docs cover what you need to do。这将使您仅需在访问视图控制器的第一个tome中从数据库/文件中加载数据即可提高应用程序的效率。然后,在切换部分时,它只能显示已经加载的VC。

答案 1 :(得分:0)

仅供参考。如果您的ViewController之一应该“显示最近的通知/文章”,则缓存数据将无法工作,因为它可能不是最新的,除非您每次都从服务器中拉出。 (除非最近的消息被推送,否则即使您不每次都拉,也可能会遇到巨大的同步问题。)

也就是说,选项1和3实际上是相同的,唯一的区别是保留信息的位置。

您不应该使用标签栏控制器。如果无法使用UISplitViewController,则应制作自己的自定义容器视图控制器。

关于缓存问题。我将为每个端点实现某种缓存机制。它可以存储在ram或磁盘中,但是我认为ram更好,因为数据听起来非常不稳定。

进行设置,以便在视图控制器进行“网络”调用时,其使用的函数使用其提取的最后数据调用闭包,然后可以选择再次进行网络调用,并使用再次调用闭包新数据。这样,VC会尽快响应数据,并且仍然会在每个视图上提取新数据。