使用updateData一次更新两个字段

时间:2020-02-13 16:37:43

标签: swift google-cloud-firestore

我正在使用以下代码更改在线状态:

static func online(for uid: String, status: Bool, success: @escaping (Bool) -> Void) {
    //True == Online, False == Offline
    let db = Firestore.firestore()
    let lastTime = Date().timeIntervalSince1970
    let onlineStatus = ["onlineStatus" : status]
    let lastTimeOnline = ["lastTimeOnline" : lastTime]
    let ref = db.collection("users").document(uid)

    ref.updateData(lastTimeOnline) {(error) in
            if let error = error {
                assertionFailure(error.localizedDescription)
                success(false)
            }
            success(true)
        }

    ref.updateData(onlineStatus) {(error) in
            if let error = error {
                assertionFailure(error.localizedDescription)
                success(false)
            }
            success(true)
        }
    }

我更新了lastTimeOnline和onlineStatus。

我通过以下方式收听此更新:

// Get the user online offline status
func getUserOnlineStatus(completion: @escaping (Dictionary<String, Any>) -> Void) {
    let db = Firestore.firestore()
    db.collection("users").addSnapshotListener { (querySnapshot, error) in
        guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
        }
        snapshot.documentChanges.forEach { diff in
            if (diff.type == .modified) {

                //GETS CALLED TWICE BUT I ONLY WANT ONCE

                print("modified called..")
                guard let onlineStatus = diff.document.get("onlineStatus") as? Bool else {return}
                guard let userId = diff.document.get("uid") as? String else {return}
                var userIsOnline = Dictionary<String, Any>()
                userIsOnline[userId] = [onlineStatus, "huhu"]
                completion(userIsOnline)
                }
            }
        }
    }

现在的问题是,由于我两次使用了ref.updateData,所以SnapshotListener .modified两次返回了所需的数据。

如何在一个调用中更新两个字段,所以我的.modified仅返回一个快照?

1 个答案:

答案 0 :(得分:3)

您可以尝试将它们组合

let all:[String:Any] = ["onlineStatus" : status ,"lastTimeOnline" : lastTime] 
let ref = db.collection("users").document(uid) 
ref.updateData(all) {(error) in
    if let error = error {
       assertionFailure(error.localizedDescription)
       success(false)
    }
    success(true)
}