最近我一直在开发一个需要以下代码的应用程序:
/** Unfriends the user with the specified UID */
func removeFriend(_ userID: String, completion: CompletionHandler? = nil) {
CURRENT_USER_FRIENDS_REF.document(userID).delete { (error) in
guard error == nil else{
completion?(error)
return
}
self.users.document(userID).collection(NameFile.Firebase.UserDB.friends).document(AppStorage.PersonalInfo.uid).delete(completion: completion)
}
}
在嵌套这些块时出现问题。如果第一个块成功,但是第二个块引发错误,则完成处理程序将传递一个错误。但是,实际上,一半的过程成功完成并成功写入数据库。是否可以将这两个块作为一个块一起工作,如果发生错误则传递一个错误。 (无需重组数据库)
答案 0 :(得分:2)
如果有多个写入操作必须调用成功或全部失败,则应使用transaction or batched write。两者之间的区别在于您是否需要文档的当前值来确定其新值。如果不需要任何文档的当前值,请使用批量写入。如果需要需要文档的当前值,请对所有写入使用事务。