firebase 使用try!和force-unwrapping更新Firestore中的数据会导致崩溃吗?

sd2nnvve  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(93)

我有一个在Firestore中更新Book文档的函数。在稍微查看了Firestore代码之后,我决定禁用错误传播(对于setData(from:completion:)),我还强制展开了可选的(book示例的id属性,该示例标记为@DocumentID)。显然,如果没有绝对的把握,我不应该这样做。t crash然而,这是我在两种情况下使用!的理由:
1.强制展开图书的id属性是可行的,因为如果我从Firestore获取了任何图书,或者使用初始化器创建了一本图书,我总是会在id字段中填充一个值。据我所知,只有当您用@DocumentID注解了一个名为name的字段,并且Firestore文档也有一个名为name的字段时,才会发生这种情况。这种情况永远不会发生,因为我永远不会将名为id的字段放在图书文档中。

  1. .setData(from:completion:)不应该抛出任何一个,因为它只会在Book示例编码出错时抛出。同样,这种情况也不应该发生,因为首先它被标记为Codable,而且我添加到数据库的每一本书都将对该结构体进行编码,保证它每次都能工作,如果它工作一次的话。
struct Book: Identifiable, Codable {
    @DocumentID var id: String?
    var title: String
}

func update(_ book: Book, completion: @escaping (Error?) -> Void) {
    let docRef = db.collection("books").document(book.id!)  //<<< Force unwrapping
    try! docRef.setData(from: book) { error in  //<<< Disabling error propagation
        completion(error)  // Any network related error thrown by Firestore is, however, handled
    }
}

我假设这段代码永远不会导致崩溃,这是不是错了?如果是,我很想知道在什么情况下可能会发生错误。

sczxawaw

sczxawaw1#

(答案是@JoakimDanielson和@Scriptable)如果示例符合Codable,并且您有足够的控制来确保数据总是准确的,那么这段代码应该永远不会崩溃,您应该编写单元测试来帮助确保这一点。
(@KirilS添加)从技术上讲,如果编码数据缺少字段(如name字段),解码可能会失败。发生这种情况的可能性很低,但不要低估服务器上发生“意外”更改的可能性。此外,较新版本的应用可能会将name属性更改为可选值,如果值为nil,使用旧版本应用程序的人可能会崩溃。如前所述,几率很低,但永远不会为0,所以不推荐这样做,因为你很容易犯错。而且犯错会对用户体验非常有害。所以没有必要冒这个险。

相关问题