Ios 在保留任何下载数据的同时在多个视图控制器之间切换的最佳方法?

Ios 在保留任何下载数据的同时在多个视图控制器之间切换的最佳方法?,ios,swift,Ios,Swift,拥有多个UIViewController的最佳方式是什么?这些UIViewController可以从侧菜单访问,并且每次显示视图控制器时不必重新下载任何数据 例如,我有三个视图控制器,一个是显示最近通知的主页,一个是显示最近文章的新闻页面,一个是包含图像集合的页面。加载每个视图控制器时,数据从远程服务器下载并显示-如果用户切换到另一个视图控制器并再次返回,我希望之前下载的数据立即显示,而无需重新下载(直到使用UIRefreshControl或类似工具) 在我的脑海中,我可以看到这是通过4种方式实

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

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

在我的脑海中,我可以看到这是通过4种方式实现的:

  • 将数据存储在单例中,并从中加载数据(如果以前下载过),然而,这似乎违背了我所看到的常规做法,也似乎没有效率-尤其是如果有大量数据和/或多视图控制器
  • 使用基于侧菜单而不是传统底部栏选择索引的UITABBARC控制器,如果侧菜单上有10-12个项目,这会导致问题吗
  • 将数据缓存到磁盘(使用NSCache等)并根据需要实例化/关闭每个视图控制器,视图控制器可以使用缓存的数据-内存中一次只存在一个视图控制器
  • 使用某种定制的容器视图来缓存视图控制器,并根据需要加载它们,感觉有点粗糙,效率不高

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

    我会选择选项3和4的组合

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


    您可能还应该构建一个容器视图控制器。这就是Tabbar控制器到底是什么。这很容易做到,也很容易。这将使您的应用程序更加高效,只需在第一次进入视图控制器时从数据库/文件加载数据。然后在切换部分时,它可以显示已经加载的VC。

    仅供参考。如果其中一个ViewController应该“显示最近的通知/文章”,则缓存数据将不起作用,因为它可能不是最新的,除非每次都从服务器中提取数据。(除非最近的数据被推送,即使这样,如果你不每次都拉的话,你可能会有巨大的同步问题。)

    也就是说,选项1和选项3实际上是相同的,唯一的区别是您将信息保存在何处

    您不应该使用选项卡栏控制器。如果不能使用UISplitViewController,则应创建自己的自定义容器视图控制器

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


    对其进行设置,以便当视图控制器进行“网络”调用时,它使用的函数使用最后提取的数据调用闭包,然后可以选择再次进行网络调用,并使用新数据再次调用闭包。这样一来,VCs在尽快获取数据时会非常迅速,并且仍然会在每个视图上显示新数据。

    您可能需要记录保持所有VCs活动和加载所需的内存开销。为此,我不确定是否需要自定义容器,但从各种注释来看,它似乎是这样的。我应该采取什么预防措施将VCs存储在内存中,还是让每个VC中的didReceiveMemoryWarning中的逻辑处理任何问题?除非您处理大量图像或其他大数据形式(多MB),否则内存使用不会成为问题。我会尽量避免任何我喜欢的两次结束的想法,我以前没有想到这一点,听起来正是我想要的。在单例中缓存数据有什么问题吗?或者你会建议像其他评论员建议的那样使用CoreData之类的东西吗?我只会将每个端点的数据作为独立实体缓存在RAM中。不是单例,因为除了调用闭包的函数之外,没有任何东西知道它的存在。所以可能是API文件中的一个私有变量。