【问题标题】:Creating a timer to delete a tableviewcell user post?创建计时器以删除 tableviewcell 用户帖子?
【发布时间】:2016-06-18 18:37:19
【问题描述】:

我正在创建一个应用程序,用户可以在其中发布包含在 tableview 中的帖子,但我希望在 10 分钟后删除帖子。所有用户都可以看到 10 分钟倒计时。

我找到了这个来源:Delete NSTimer/UITableViewCell in real time?

他们似乎在设置帖子过期的日期,设置一些计时器以每秒倒计时,如果剩余时间为 0,则帖子将被删除,firebase 上的引用将被删除。

如果用户杀死应用程序,这不会完全崩溃和烧毁吗?因此,例如,用户发了一个帖子,将其发布到 firebase,然后发送出去,用户终止了应用程序,这些计时器停止,帖子就永远卡住了。当然,每个用户都需要为发送给他们的每个帖子运行一个计时器,但是谁负责在 firebase 上删除该引用?

我的问题是跟踪这些计时器的最佳位置/方式是在哪里/如何?我不知道是否可以在这里使用一些 firebase 来使其更干净。我知道如何使用计时器以及如何使用计时器删除帖子,但我只是不确定如何构建这一切。

【问题讨论】:

  • 如果帖子存储在服务器上,则在计时器到时删除帖子是服务器的工作。依赖客户端设备是不切实际的,因为正如您所说,如果客户端终止应用程序,则帖子将永远留在那里。

标签: ios swift notifications firebase


【解决方案1】:

没有真正正确且 100% 可靠/稳健的方法可以使用任何类型的 CLIENT 应用解决方案来清理此问题。您需要一个后端进程来处理这个问题。如果您不想维护自己的服务器,这是一种可能的解决方案。

您可以使用 Google App Engine 并编写一个后端,该后端每隔 X 小时运行一次脚本以清除旧条目(注意时间戳中的 TZ,确保一切一致)。根据您是否觉得将来会有其他处理需求,这样做可能非常值得。

为此,您需要一个完整的 Google App Engine (Google Cloud) 帐户,并且可能需要更高的即用即付定价,但运行自己的服务器可能会更加昂贵。

有关如何处理此问题的详细信息,请参见此处:https://cloud.google.com/solutions/mobile/firebase-app-engine-android-studio

从那里你应该看看他们所做的漂亮的设计选项图,以可视化你的客户端应用程序 + firebase + 应用程序引擎如何协同工作。 https://cloud.google.com/solutions/mobile/mobile-app-backend-services

顺便说一句,Google 大约一个月前上传了精美的新教程 (codelabs),替换了 firebase 的所有旧文档。所以我怀疑他们很快也会添加一个带有应用引擎集成的代码实验室(我还没有找到)。同时,你可以看到我上面贴的那个,来自google的官方云站。

【讨论】:

    【解决方案2】:

    如果您的应用程序终止,计时器会被终止,您是对的。如果您的应用程序被暂停,它们也会被暂停。几乎任何时候用户切换到另一个应用程序并在那里停留超过几秒钟,这种方法都行不通。

    您可以将过期日期数组保存为用户默认值,并且在应用启动/返回到前台时,您可以检查过期日期数组。如果过期日期已过,您将从 Firebase 中删除该帖子。 (实际上,您可能会保存一组字典,其中一个键是日期,另一个键是记录 ID,因此您可以找到记录。)

    您还可以使用条目的过期日期作为通知的触发日期来创建本地通知。如果您的应用程序正在运行,它将在后台收到通知,您可以触发删除。如果不是,它会向用户显示一条消息,如果用户要求打开应用程序,您可以检查您的过期日期数组,如上所述。

    【讨论】:

    • 嘿,这些想法适用于单用户应用程序,但不适用于多用户,对吧?因为那依赖于发布者登录才能删除其他所有人的帖子。对于多用户应用程序,我是否需要像 Creos 所说的那样有后端为我处理它?如果可能的话,我想避免这种情况,因为我觉得这可能有点超出我的能力。为每个人提供一个计时器,该计时器每秒检查当前帖子的到期日期并且一旦超过该时间就不会显示它们,这有什么根本错误吗?
    • 另外,我只是想到了这一点。我可以使用 firebase 仅向使用 endAt 查询不到 4 分钟的用户发送帖子吗?
    • 多个用户?在单个设备上,还是在多个设备上?如果您使用单个设备,您将需要某种登录机制,其中包含消息及其过期时间的数据库,按用户 ID 细分。不过,单个设备上的多用户系统似乎很愚蠢。如果每台设备只有一个用户,那么您需要一个基于服务器的数据库。
    • 使用每秒触发一次并检查所有消息的计时器会起作用,但随着消息数量的增加,它不会很好地扩展。或者,您可以在返回前台时运行所有现有消息,并为在该消息到期时触发的每条消息创建一个计时器。
    • 是的,抱歉,我的意思是多个设备上的多个用户,措辞不好。非常感谢您的建议和帮助!
    【解决方案3】:

    您不应依赖您的客户端应用程序来删除帖子。正如你所说,杀死应用程序会导致服务器损坏。

    更好的解决方案是创建具有有效期的帖子,并在您的应用中仅显示有效帖子。 要更新 UI,您可以设置计时器以在达到有效日期时触发。

    【讨论】:

    • 好的,所以我明白我将如何为 1 个用户应用程序实现您的想法。但是,如何为其他用户设置该计时器?所以用户 A 发送了一个帖子,用户 B 和 C 收到了这个帖子......在 4 分钟内我不想再为他们显示那个帖子了......他们加载了应用程序,从 firebase 获取它,我只是有在每个人的应用程序上运行一个计时器,以每秒检查当前日期与为帖子存储的到期日期?因为如果某人目前有 4 个帖子,我需要不断检查所有帖子的到期日期,对吗?感谢到目前为止的帮助
    • 对于您从服务器收到的每个帖子,您设置一个计时器以在达到其有效期时触发。如果太复杂,您可以定期在后台线程上检查其中一篇帖子是否无效,并要求 UI 在主线程上重新加载。
    猜你喜欢
    • 2021-07-18
    • 2021-10-19
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2019-08-09
    • 2019-12-01
    相关资源
    最近更新 更多