Не умеет читать `childChanged` - PullRequest
       3

Не умеет читать `childChanged`

0 голосов
/ 12 января 2020

Я хочу слушать childChanged в моем приложении. У меня есть firebaseStructure, как это:

-counters
--- currentLoggedInUsers: 4

Я хочу иметь возможность слушать, когда currentLoggedInUsers изменяется.

Мое лучшее усилие таково:

 ref?.child("counters").observe( .childChanged, with: { (snapshot) in
            let dict = snapshot.value as? [String : Int] ?? [:]
            print(snapshot) //Prints the correct value when updated

            self.currentLoggedInUsers = dict["currentLoggedInUsers"]! 
     })    

snapshot печатается правильно при обновлении, но self. currentLoggedInUsers = dict["currentLoggedInUsers"]! выдает ошибку:

Тема 1: Фатально ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

1 Ответ

2 голосов
/ 12 января 2020

Этот ответ будет зависеть от того, есть ли в счетчиках другие дочерние узлы. Так что, если это просто

counters
   currentLoggedInUsers: 2

, то следует использовать следующий код, имея в виду, что .value приведет к немедленному запуску кода в замыкании.

let ref = self.ref.child("counters").child("currentLoggedInUsers")
ref.observe(.value, with: { snapshot in
    print(snapshot.key, snapshot.value)
})

наблюдает за указанным c дочерним узлом на предмет изменений.

обратите внимание, что self.ref указывает на мой firebase как класс var

Чтобы немного расширить, предположим, что у вас есть другие дочерние узлы в счетчиках и Вы также хотите следить за их изменениями.

counters
   currentLoggedInUsers: 2
   totalUsers: 100
   usersFavFood: Tacos

и один способ справиться с этим -

let ref = self.ref.child("counters")
ref.observe(.childChanged, with: { snapshot in
    let nodeKey = snapshot.key

    switch nodeKey {
    case "currentLoggedInUsers":
        let count = snapshot.value as? Int ?? 0
        print("logged in users changed to: \(count)")
    case "totalUsers":
        let totalCount = snapshot.value as? Int ?? 0
        print("total Users: \(totalCount)")
    case "usersFavFood":
        let food = snapshot.value as? String ?? "No food for you"
        print("favorite food changed to: \(food)")
    default:
        print("some node changed but it's not handled")
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...