就像使用 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:快速查找对象中的值(就像我们可以使用属性一样)