从 firebase 检测值并从 superView 中删除(如果为真)
Posted
技术标签:
【中文标题】从 firebase 检测值并从 superView 中删除(如果为真)【英文标题】:detect value from firebase and remove from superView if is true 【发布时间】:2021-01-04 01:37:14 【问题描述】:我有一个与 tinder 非常相似的 cardView。我正在尝试检测用户是否刷过,如果用户刷过,请从 superView 中移除卡片。
我的 firebase 结构看起来像,
我尝试移除卡的方式是,
func fetchUserSwipes()
let uid = Auth.auth().currentUser?.uid
Database.database().reference().child("userSwipesForCU").child(uid!).observe(.childAdded, with: (snapshot) in
if let userDictionary = snapshot.value as? [String: AnyObject]
let user = User(dictionary: userDictionary as [String : AnyObject])
self.user = user
let poster = Poster(dictionary: userDictionary as [String : AnyObject])
let cardView = self.setupCardFromUser(poster: poster)
if snapshot.exists()
cardView.removeFromSuperview()
print("this value exist and should not present to card view")
else
print("this value does not exist")
, withCancel: nil)
如果用户之前刷过卡片,我希望卡片不显示。测试代码时我没有收到错误,但它没有执行。如果存在与当前卡匹配的快照,则应将其删除。
经过一番调查,我设法创建了下面的代码。这段代码有些工作,但不是我希望的方式。它仍然保存代码,当我刷新页面时,保存到 firebase 的卡片不显示,但它只显示虚拟卡片。
func fetchUserSwipes()
let uid = Auth.auth().currentUser?.uid
let ref = Database.database().reference(withPath: "userSwipesForCU")
ref.child(uid!).observeSingleEvent(of: .value, with: (snapshot) in
if let userDictionary = snapshot.value as? [String: AnyObject]
let user = User(dictionary: userDictionary as [String : AnyObject])
self.user = user
let poster = Poster(dictionary: userDictionary as [String : AnyObject])
let cardView = self.setupCardFromUser(poster: poster)
if cardView == ref.child("fromId")
cardView.removeFromSuperview()
print("this value exist and should not present to card view")
else
print("this value does not exist")
, withCancel: nil)
【问题讨论】:
"它不执行" 你能澄清你的意思吗?例如,如果您在if let userDictionary = ...
上放置一个断点并在调试器中运行代码,它会到达该行吗?如果没有,如果您还附加了一个 cancel
处理程序会发生什么:firebase.google.com/docs/reference/swift/firebasedatabase/api/…: that 会被调用吗?
@FrankvanPuffelen 谢谢你的建议!添加 withCancel 确实有帮助,现在调用了该函数。我可以在控制台中看到这一点。现在我的主要问题是,卡片仍然出现。我是否必须检查卡的 id 是否等于保存在 firebase 中的 id 然后删除卡?
@FrankvanPuffelen 我按照我上面所说的做了,效果有点好,但并不完全符合我的要求。我更新了我的代码以显示我尝试过的内容。
【参考方案1】:
尝试使用一次获取数据的方法 官方 Firebase 文档:https://firebase.google.com/docs/database/ios/read-and-write#read_data_once
let uid = Auth.auth().currentUser?.uid
Database.database().reference().child("userSwipesForCU").child(uid!).observeSingleEvent(of: .value, with: (snapshot) in
if let userDictionary = snapshot.value as? [String: AnyObject]
let user = User(dictionary: userDictionary as [String : AnyObject])
self.user = user
let poster = Poster(dictionary: userDictionary as [String : AnyObject])
let cardView = self.setupCardFromUser(poster: poster)
if snapshot.exists()
cardView.removeFromSuperview()
print("this value exist and should not present to card view")
else
print("this value does not exist")
【讨论】:
这确实有点帮助,但我仍然面临一个问题。它将卡片保留在那里,但它使它们变为空白而不是完全删除它们。 您好,请添加一些示例代码进行说明,并粘贴到相关文档中以防止链接腐烂。以上是关于从 firebase 检测值并从 superView 中删除(如果为真)的主要内容,如果未能解决你的问题,请参考以下文章
无法使用使用 firebase 创建的登录模块进行注册,并从客户端收到错误“TypeError: Cannot read property 'email' of null”
如果用户从 IdentityServer4 中的另一个浏览器/设备登录,如何检测并从应用程序中注销用户?
从 Firebase 检测带有 UUID 的 iBeacons