首页 > 解决方案 > 为什么即使在 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)
        }
    })
}

有什么解决办法吗?

标签: swiftfirebasecachinggoogle-cloud-firestore

解决方案


不存在的文档仍将返回文档快照,但它们将为空。因此,您必须检查文档的快照内容,而不是快照本身。此外,您应该更好地处理错误和返回的整体流程。

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 {
        ...
    }
})

推荐阅读