为什么即使在Swift中删除FireStore对象,我仍然能够获取数据?

为什么即使在Swift中删除FireStore对象,我仍然能够获取数据?,swift,firebase,caching,google-cloud-firestore,Swift,Firebase,Caching,Google Cloud Firestore,我删除了Firestore中的一个条目,并手动检查以确认这一点。但是,只要我不关闭应用程序,我就可以发送一个请求来获取数据,并且仍然可以得到结果。事实不应如此 如果您设想拥有一张包含一些文本信息的共享照片,并且您删除了这些信息,这意味着其他用户仍然可以看到文本信息(从Firestore获取),但不再可以看到图像(存储在Firestorage中) 我想在UI上显示一条消息,类似于“内容不再存在” 我怎样才能做到这一点?到目前为止,我使用了以下方法,但目前不起作用: public func chec

我删除了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 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
        }
    })
}
作为旁注,我建议对函数的参数重新排序,以便在调用时更容易阅读(通常,完成处理程序排在最后),并为布尔参数命名,以便在引用时更容易阅读(稍后或由其他开发人员)


您是否启用了持久性?另外,您似乎忽略了querySnapshot的潜在错误?还有querySnapshot!。您可能应该添加这样的内容
guard let doc=documentSnapshot?.data()else{display error and return}
,以安全地处理选项并保护您的代码。您可能想使用
addsnapshotstener
而不是
getDocument
?当文档以任何方式被更改(或在您的情况下被删除)时,将触发前者
getDocument
适用于只想获取一次数据的情况。您是否启用了持久性?另外,您似乎忽略了querySnapshot的潜在错误?还有querySnapshot!。您可能应该添加这样的内容
guard let doc=documentSnapshot?.data()else{display error and return}
,以安全地处理选项并保护您的代码。您可能想使用
addsnapshotstener
而不是
getDocument
?当文档以任何方式被更改(或在您的情况下被删除)时,将触发前者
getDocument
适用于只想获取一次数据的情况。你好@bsod。你是一个传奇!谢谢你的回复。这解决了我的问题Hello@bsod。你是一个传奇!谢谢你的回复。这解决了我的问题