就像使用 Firebase 崩溃的反馈一样。快速点赞-删除赞

Posted

技术标签:

【中文标题】就像使用 Firebase 崩溃的反馈一样。快速点赞-删除赞【英文标题】:Like feedback using firebase crash. Fast click like-remove like 【发布时间】:2017-08-15 06:00:45 【问题描述】:

我有一个像 instagram 这样的应用程序。它有反馈页面。

当用户喜欢某个帖子时,我会添加这个赞和反馈(用它自己的密钥 (.childByAutoId) 给这个赞。

static func add(_ newLike: LikeItem) 
  // add like id for user feedback implementation
  var like = newLike
  let likeRef = ref.child("/userslikes/" + newLike.userId + "/onposts/" + newLike.postId).childByAutoId()
  like.key = likeRef.key

  var updates: [String: Any?] = [
     "/userslikes/" + like.userId + "/onposts/" + like.postId: like.toAnyObject(),
     "/postslikes/" + like.postId + "/"         + like.userId: like.toAnyObject()
  ]

  if like.userId != like.postAddedByUserId  // dont add your own likes
     var likeForFeedBack = like.toAnyObject()
     likeForFeedBack["isViewed"] = false // when user will open feedback -> true
     updates.updateValue(likeForFeedBack, forKey: "/feedback/" + like.postAddedByUserId + "/" + like.key)
  

  ref.updateChildValues(updates)

没关系。而且我还有remove 功能。它会喜欢节点,从这个喜欢中得到这个喜欢和feedbackId。然后我进行多部分更新。

static func remove(with userId: String, _ post: PostItem) 
  var updates: [String: Any?] = [
     "/userslikes/" + userId   + "/onposts/" + post.key: nil,
     "/postslikes/" + post.key + "/"         + userId:   nil
  ]

  // deleting from feedback node
  getLikeFromUser(id: userId, postId: post.key)  like in
     if like.userId != like.postAddedByUserId 
        updates.updateValue(nil, forKey: "/feedback/" + like.postAddedByUserId + "/" + like.key)
     

     ref.updateChildValues(updates)
  


static func getLikeFromUser(id: String, postId: String,
                           completion: @escaping (_ likeId: LikeItem) -> Void) 
  let refToLike = ref.child("/userslikes/" + id + "/onposts/" + postId)

  refToLike.observeSingleEvent(of: .value, with:  snapshot in
     let like = LikeItem(snapshot: snapshot)

     completion(like)
  )

所以,当用户点击“删除喜欢”时,我有一些延迟(此时它正在获取类似实体以获取反馈 id)。

问题:如果我向like-removeLike 按钮发送垃圾邮件(如 - 删除 - l - rl - l - rl 等),有时我的反馈节点会重复(使用不同的键ofc。它没有删除旧节点),有时它没有添加(在这种情况下,如果我将来尝试删除它,它会崩溃)。

如何解决?

【问题讨论】:

我的拙见,首先这可以通过用户体验限制来解决。用户不应向应用程序中的任何按钮发送垃圾邮件。必须是此事件之间的延迟。即使你可以添加一些最大值。在用户决定之间切换......等待一段时间,让它再次免费(也许)。如果我理解正确的话。 @gyer 那么,如果我将阻止按钮,直到以前的数据将被写入数据库,可以解决吗?你也可以写答案。如果没有更多答案,我可以接受。谢谢 【参考方案1】:

我的拙见,首先这可以通过 UX 限制来解决。用户不应向应用程序中的任何按钮发送垃圾邮件。必须是此事件之间的延迟。即使你可以添加一些最大值。在用户决定之间切换......等待一段时间,让它再次免费(也许)。

正如您在评论中所说,这是一个非常好的主意和良好的 UX 等待用户完成写入操作。这样您就可以消除不良的用户体验。

您可以使用 UIView 的userinteractionenabled 属性。

设置为 NO 时,触摸、按下、键盘和焦点事件 用于视图的将被忽略并从事件队列中删除。 设置为 YES 时,事件将正常传递到视图。这 此属性的默认值为 YES。

在动画期间,用户 对所有涉及的视图的交互暂时禁用 动画,无论此属性中的值如何。您可以禁用 这种行为通过指定 配置时的 UIViewAnimationOptionAllowUserInteraction 选项 动画。

当然有很多选择,天空是 UX 场景的极限。

您还可以查看 Apple 的加载用户界面指南:

https://developer.apple.com/ios/human-interface-guidelines/interaction/loading/

尽快显示内容。不要让人们等待内容 在看到他们期望的屏幕之前加载。显示屏幕 立即,并使用占位符文本、图形或动画 确定内容尚不可用的地方。替换这些占位符 内容加载时的元素。只要有可能,预加载即将到来 背景中的内容,例如在播放动画时或 用户正在导航关卡或菜单。

可能还有指标:

https://developer.apple.com/ios/human-interface-guidelines/ui-controls/progress-indicators/

如果有帮助,请在等待任务时提供有用的信息 去完成。在活动指示器上方添加一个标签以提供额外的 语境。避免使用诸如加载或身份验证之类的模糊术语,因为它们 通常不增加任何价值。

另一种选择

就像您在下面的评论中所说的那样,在用户使用 ViewController 之前,还有另一个选项可以保持喜欢/不喜欢。但是还有另一个 UX 问题,当用户尝试关闭模式或返回到以前的视图控制器时,他们将等到这个后台作业完成。另一个问题,如果用户杀死应用程序,您还有 1 个更改来保存数据,它是 AppDelegate 的 applicationWillTerminate。但由于 5 秒的限制,将数据保存在那里是不好的做法:

https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623111-applicationwillterminate

这个方法让你的应用知道它即将被终止并且 完全从记忆中清除。您应该使用此方法执行任何 应用程序的最终清理任务,例如释放共享资源, 保存用户数据,并使计时器失效。您对此的实施 方法大约有 五秒钟的时间来执行任何任务并返回

如果方法在时间到期前没有返回,系统可能会kill 整个过程。对于不支持后台的应用 执行或链接到 iOS 3.x 或更早版本,此方法是 当用户退出应用程序时总是调用。对于支持的应用程序 后台执行,一般不调用这个方法 用户退出应用程序,因为应用程序只是移动到后台 那个案子。但是,可以在以下情况下调用此方法 应用程序在后台运行(未挂起)并且系统需要 出于某种原因终止它。调用此方法后,应用程序 还发布一个 UIApplicationWillTerminate 通知给 感兴趣的对象有机会响应过渡。

希望对你有帮助。

【讨论】:

只有一件事让我感到困惑。 Instagram 不会阻止点赞按钮。我发明的另一种选择是保存最终状态并仅在发布信息(单元或控制器 nvm)离开时更新它。但是,当用户在此页面上时,idk 关闭应用程序时该怎么做 您对 Instagram 的看法是正确的。但他们可能没有任何性能问题。在 appdelegate applicationwillterminate 上保存更改不是一个好主意,因为您有 5 秒的限制。 也许是另一种方法。开始写入 db,完成后 - 检查 like 的状态,如果是另一个,则发送另一个写入请求。好吃吗? 为什么?看。 1)我点了喜欢-发送请求-l-rl-l-rl-l-rl-写操作完成-检查状态-更改-发送另一个请求。 2)我点了喜欢-发送请求-l-rl-l-rl-l-写操作完成-检查状态-没有改变-不发送任何请求。 好的。我会成功的。另外,如果没有其他更好的答案,我会等到晚上并接受。还是谢谢!

以上是关于就像使用 Firebase 崩溃的反馈一样。快速点赞-删除赞的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Crashlytics 没有在控制台仪表板中快速显示崩溃报告

我如何向最近的应用程序用户发送请求,就像颤动中的优步一样

Javascript:快速查找对象中的值(就像我们可以使用属性一样)

从 Firebase 存储中删除文件会导致崩溃

如何在表格里迅速定位到别的文件,就像网页链接一样。描述的模糊了,请电脑高手指点

进行快速崩溃的最简单方法是什么?