iOS-持续侦听数据库更新实现

iOS-持续侦听数据库更新实现,ios,swift,Ios,Swift,我有一个项目,其中有4个选项卡栏,当我切换选项卡时,获取更新视图的api请求的api位于方法viewdidappease()中 然而,这将给用户带来非常糟糕的用户体验,因为每当他们切换选项卡、加载图标时,有时会加载0.5秒,但加载图标的立即出现和消失对用户体验的角度来说是非常糟糕的。我如何实现这样一个视图:每当数据库值更改时,我的视图都会自动更新自身 我曾想过使用Timer()来实现它每秒调用api的功能,但这并不实际,因为它会一直每秒调用api。 有人有什么建议吗?谢谢这里有很多东西需要解开,

我有一个项目,其中有4个选项卡栏,当我切换选项卡时,获取更新视图的api请求的api位于方法viewdidappease()中

然而,这将给用户带来非常糟糕的用户体验,因为每当他们切换选项卡、加载图标时,有时会加载0.5秒,但加载图标的立即出现和消失对用户体验的角度来说是非常糟糕的。我如何实现这样一个视图:每当数据库值更改时,我的视图都会自动更新自身

我曾想过使用Timer()来实现它每秒调用api的功能,但这并不实际,因为它会一直每秒调用api。
有人有什么建议吗?谢谢

这里有很多东西需要解开,但我将尝试提供一个概括的答案,并指出几个可能的解决UX问题的方法

这里有几个方面可以发挥作用:

  • 您是否控制数据来自的后端,即是否可以遵循paiv的评论并实现推送通知?或者使用一些纯HTTP(S)请求以外的其他方法,比如websocket
  • 数据更改的频率如何?在从一个选项卡切换到另一个选项卡之间这样做是否现实?
    • 请注意,当您的用户在一个选项卡上时,数据发生更改时,您会怎么做?有没有什么新鲜感?如果不立即通知他们这件事会有问题吗?有刷新按钮吗
  • 您是否在视图的屏幕时间之外保存数据?当用户重新访问某个选项卡时,该选项卡是否被废弃,即,在处理API响应之前,选项卡是否始终开始“空”,或者用户是否看到上次访问该选项卡时的值
  • 最好的做法在很大程度上取决于这些问题的确切答案。如果您不能使后端除了服务HTTP请求之外做任何事情,并且必须不断更新所有数据,那么显然您必须执行类似于您描述的轮询的操作。更新间隔取决于这对用户的重要性。即使是1秒,也要注意这意味着他们可以在获取下一次更新之前访问选项卡

    如果您可以调整后端和最新数据是必须的,那么推送通知或WebSocket可能是一种方法(请记住,WebSocket意味着每个活动用户都有一个打开的连接!)。 推送通知可能会在更新间隔太长时发生故障(即,如果数据在后端很快发生更改,并且您不断对其进行垃圾邮件处理),但在其他情况下,推送通知会很好地工作,并且如果使用正确,推送通知会更新屏幕上已经显示的视图

    然而,在我见过的90%的情况下,使用常规HTTP请求和正确设计的UI是最佳选择。正确地将UI代码与数据加载代码和显示数据的代码分离也是非常重要的。下面是我将如何处理这个问题:

  • 在应用程序中以某种方式正确持久化数据,而不需要单独拥有数据的视图。如果您想在应用程序运行时之外持久化,这意味着CoreData(或等效物),否则内存中的存储就可以了(这是一种全局状态)
  • 在您的UI中,显示您当前拥有的任何数据,即使这些数据是“过时的”(在您的示例中是:“上次用户在此选项卡上时留下的”)。设计UI,使其清晰可见(灰显,在重新加载/更新数据时在数据旁边放置微小的活动指示器,或类似的东西)
  • 如图2所示。显示应用程序是否正在加载数据。当用户转到某个选项卡时启动加载是可以的,但是不要创建一个完全由它控制的UI(比如一个巨大的空视图,上面有一个微调器)
  • 从功能上讲,加载不应直接更新任何视图,而是将新数据写入存储,并仅通知视图和视图控制器需要更新自身(如果您使用CoreData和/或组合,则基本上可以免费获得大量此逻辑,尤其是对于SwiftUI应用程序)
  • 这样的设计也有助于以后适应推送通知:当最初通过选项卡开关(例如“刷新”按钮)触发重新加载时,一旦(静默)PNs可用,它们就会触发重新加载。甚至WebSocket也可以或多或少地集成到这一点中,尽管可能还有更多的工作要做


    无论如何,正如前面所说,这完全取决于您的用例和可用资源,但其要点可能是“如果您当前的加载图标破坏了用户体验,请正确地重新设计它”。我在这里的直觉是,其他任何东西都可能会超出您的需要……

    使用Firebase Cloud Firestore数据库否,为什么Firebase是这里的解决方案?设想该体系结构在技术堆栈中不包含firebase,在这种情况下,迁移到firebase将做什么?是的,firebase不是通知客户端应用程序远程数据已更改的选项,您可以使用(可选后台)远程推送通知。这是在API服务器上实现的。感谢您提供的有用信息。非常感谢。你指出了一些值得研究的观点和参考。再次感谢您接受的回答(非常欢迎,即使我不能给出一个简单的“这样做就行了”的回答。)很高兴我冗长的阐述能为您服务!