我有一个获取 convo 的函数,它有效,但后来我删除了 Firebase 中的所有文档。所以现在当我运行它时,它说“文档路径不能为空”并且应用程序崩溃。我对 Swift 不太熟悉,但在 Python 中我只是简单地使用 try 和 except。
在 try 块中,我可以简单地复制并粘贴所有代码,而 except 块我只是进行错误处理。我不知道如何在 Swift 中为我的整个函数执行此操作。如何重新排列我的函数,使函数体位于 do/try 块内?
另外,进行错误处理的最重要的策略是 viewModel 文件还是 Service 文件? viewModel 文件从服务文件继承函数。
查看模型文件:
func fetchConvos(){
var userList: [User] = []
service.getConversations() { users in
userList = users
userList.forEach { user in
var messList: [Message] = []
}
}
}
服务文件:
func getConversations(completion: @escaping([User]) -> Void){
Firestore.firestore().collection("users")
.document(uid)
.collection("user-convo")
.getDocuments { snapshot, _ in
guard let documents = snapshot?.documents else { return }
documents.forEach { doc in
let userID = doc.documentID
users.append(userID)
completion(users)
}
}
}
尝试将异常作为流量控制来处理在这里是一个坏主意。请参阅解释原因:为什么不使用异常作为常规控制流?
因此,不要处理
uid
为 null 或空时出现的异常,而是先检查它是否有值,然后仅在 if 有值时使用它调用 Firestore API。例如:
if !(uid ?? "").isEmpty {
Firestore.firestore().collection("users")
.document(uid)
.collection("user-convo")
...
}
没有具体的操作来检查集合是否存在。
相反,当您向其中添加第一个文档时,集合就会存在,而当您从中删除最后一个文档时,集合就会消失。
因此,要检查集合是否存在,最简单的方法是尝试从中读取单个文档。
Firestore.firestore().collection("users")
.document("theUID")
.collection("user-convo")
.limit(to: 1) // 👈
.getDocuments { snapshot, _ in
if !snapshot!.isEmpty ... // 👈
}
我会避免“检查”集合是否存在,除非有充分且具体的理由。如果没有,那么只需查询您需要的文件,如果找到了,就得到了,如果没有,则没有;从那里开始。
至于您的错误, do-try-catch 方法不是我在这里使用的解决方案,因为这种错误处理应该保留给您无法控制的事情,例如网络任务。您的具体错误完全在您的控制范围内,因为您构建了非法文档路径。您可以而且应该通过简单地确保传递到路径中的字符串有效来防止这种情况,如果有可能的话,这始终是最佳实践
nil
。
此外,从该集合中删除文档和您收到的错误似乎是巧合,除非其他地方有代码根据该集合中文档的存在来构造该文档路径。如果不存在(而且可能不应该存在),那么这只是一个巧合。