ProjektWeinheim
ProjektWeinheim

Reputation: 201

Update two fields at once with updateData

I am changing my online status with this code:

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)
        }
    }

I update the lastTimeOnline and the onlineStatus.

I listen to this updates via:

// 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)
                }
            }
        }
    }

The problem is now, since I use ref.updateData twice, my SnapshotListener .modified returns the desired data twice.

How can I update two fields in a single call, so my .modified just return one snapshot?

Upvotes: 0

Views: 44

Answers (1)

Shehata Gamal
Shehata Gamal

Reputation: 100503

You can try to combine them

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)
}

Upvotes: 3

Related Questions