Обновите два поля одновременно с updateData - PullRequest
0 голосов
/ 13 февраля 2020

Я изменяю свой онлайн-статус с помощью этого кода:

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 Ответ

3 голосов
/ 13 февраля 2020

Вы можете попробовать объединить их

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...