swift - 为什么即使在 Swift 中删除 FireStore 对象,我仍然能够获取数据?
问题描述
我删除了 Firestore 中的一个条目,并手动检查了它以确认。但是,只要我不关闭应用程序,我可以发送一个请求来获取数据,我仍然可以得到结果。这不应该是这样。
如果您想象有一张包含一些文本信息的共享照片并且您删除了这些信息,这意味着其他用户仍然可以看到文本信息(从 Firestore 中获取),但不能再看到图像(存储在 Firestorage 中)。
我想在 UI 上显示一条消息,例如“内容不再存在”。
我怎样才能做到这一点?到目前为止,我使用了以下方法,但目前不起作用:
public func checkIfChallengeObjectExists(completionHandler:@escaping(Bool)->(), challengeId:String) {
CHALLENGE_COLLECTION?.document(challengeId).getDocument(completion: { (querySnapshot, error) in
if (error != nil) {
print(error?.localizedDescription as Any)
}
if (querySnapshot?.documentID == "" || querySnapshot!.metadata.isFromCache) {
completionHandler(false)
}
else {
completionHandler(true)
}
})
}
有什么解决办法吗?
解决方案
不存在的文档仍将返回文档快照,但它们将为空。因此,您必须检查文档的快照内容,而不是快照本身。此外,您应该更好地处理错误和返回的整体流程。
public func checkIfChallengeObjectExists(completionHandler:@escaping(Bool)->(), challengeId:String) {
CHALLENGE_COLLECTION?.document(challengeId).getDocument(completion: { (querySnapshot, error) in
if let doc = querySnapshot,
doc.exists {
completionHandler(true) // only one possible true condition
} else {
if let error = error {
print(error.localizedDescription)
}
completionHandler(false) // all else false
}
})
}
作为旁注,我建议重新排序函数的参数以使其在调用时更易于阅读(通常,完成处理程序位于最后)并为布尔参数命名,以便在引用时更易于阅读(稍后或由其他开发商)。
public func verifyChallengeObject(ID: String, _ completion: @escaping (_ exists: Bool) -> Void) {
...
}
verifyChallengeObject(ID: "abc123", { (exists) in
if exists {
...
} else {
...
}
})
推荐阅读
- javascript - 从禁用状态重新启用时,如何让 Chrome 扩展程序触发功能?
- javascript - TypeScript - 使用装饰器向类添加方法
- hadoop - Hadoop:HDFS 空间配额
- servicestack - ServiceStack 试图创建我自己的 OpenIdOAuthProvider 但 VS 2017 说缺少程序集 5.0.0.0
- java - 如何使用java从网站中提取流URL?
- javascript - 无法在使用 testcafe 的反应组件“类型搜索下拉列表”中输入文本
- android - 启动时仅启动前台服务,但不启动主要活动
- image - 从 PageSpeed Insights 下载优化图像
- c# - C# Task.Kill() 不可用
- amazon-web-services - 函数完成后 Lambda API 超时