是否可以通过传入一个对象来简单地更新 Firestore 对象,并让它找出具体要更新的内容?
Posted
技术标签:
【中文标题】是否可以通过传入一个对象来简单地更新 Firestore 对象,并让它找出具体要更新的内容?【英文标题】:Is it possible to simply update Firestore object by passing in an object, and letting it figure out what to update specifically? 【发布时间】:2022-01-20 02:11:22 【问题描述】:我设计了我的代码,以便对我的 api 服务隐藏 Firebase(例如,CurrentUserAPIService
),因此如果我想更新用户对象,我想执行以下操作:
// CurrentUserAPIService.swift
func updateCurrentUser(with currentUser: CurrentUser, completionHandler: @escaping (Result<CurrentUser, APIError>) -> Void)
myAPI.updateObject(object: currentUser, withId: currentUser.id, atPath: .users) result in
switch result
case .success:
print("Success")
completionHandler(.success(currentUser))
case .failure(let error):
print("Error: \(error.localizedDescription)")
completionHandler(.failure(error))
它将调用我的 API 类来执行以下操作:
// MyAPI.swift
func updateObject<T: Encodable>(object: T, withId objectId: String, atPath path: Path, completionHandler: @escaping (Result<Void, APIError>) -> Void)
let documentReference = Firestore.firestore().collection(path.rawValue).document(objectId)
do
try documentReference.updateData(object, completion: error in
if let error = error
print("Error: \(error.localizedDescription)")
completionHandler(.failure(.generic(message: error.localizedDescription)))
else
completionHandler(.success(()))
)
catch
print("Error: \(error.localizedDescription)")
completionHandler(.failure(.generic(message: error.localizedDescription)))
这可能吗?如果可能的话,我想要一种方法来传递完整的对象并有一个帮助函数来确定实际自动上传的内容。
【问题讨论】:
【参考方案1】:如果你真的需要使用 updateData 语法,你应该在setData()
周围写一个包装器。 Firestore 无法知道您要更新什么。 merge:true
将确保本地副本上的任何字段覆盖数据库副本。它不会从数据库中删除任何字段。
extension DocumentReference
func updateData<T: Encodable>(for object: T, completion: @escaping (Error?) -> Void)
do
try self.setData(from: object, merge: true) err in
completion(err)
catch
completion(error)
【讨论】:
以上是关于是否可以通过传入一个对象来简单地更新 Firestore 对象,并让它找出具体要更新的内容?的主要内容,如果未能解决你的问题,请参考以下文章