Как создать функцию, которая должна выполнить запрос к базе данных Firebase и вернуть значение запроса в виде целого числа? - PullRequest
0 голосов
/ 18 ноября 2018

В настоящее время мы создаем приложение для iOS с базой данных Firebase.Пожалуйста, найдите ниже наш код.

static func getTilesPerRow () -> Int{

    let user = Auth.auth().currentUser
    guard let uid = user?.uid else {
        return -2
    }
    var ref: DatabaseReference!
    ref = Database.database().reference()
    let userRef = ref.child("user").child(uid)

    var num = -1

    let queue = DispatchQueue(label: "observer")

    userRef.child("tilesPerRow").observe(DataEventType.value, with: { (snapshot) in
        // Get user value
        print("now inside the observe thing------------------")
        let value = snapshot.value as? NSDictionary
        num = snapshot.value as? Int ?? 0
        print("just updated the number to ", num)
        print("the snapshot is ", snapshot)
        print("the value is ", value)
        print("the real value is", snapshot.value)
        print("just making sure, the number that was set is ", num)

    }) { (error) in
        print("there was an error!!!!!!!!!!!!!!!!!")
        print(error.localizedDescription)
    }

    print("about to return from the function ", num)
    return num
}

В настоящее время во время выполнения этого кода мы получаем следующий вывод:

about to return from the function  -1
now inside the observe thing------------------
just updated the number to  5
the snapshot is  Snap (tilesPerRow) 5
the value is  nil
the real value is Optional(5)
just making sure, the number that was set is  5

Наш ожидаемый вывод:

now inside the observe thing------------------
just updated the number to  5
the snapshot is  Snap (tilesPerRow) 5
the value is  nil
the real value is Optional(5)
just making sure, the number that was set is  5
about to return from the function  5

Проблема в том, что мыпытаются получить значение того, что запрос нашел, но поскольку .observe () является асинхронным, функция завершается до того, как .observe () обновляет значение num.Как мы возвращаем правильное значение?

1 Ответ

0 голосов
/ 18 ноября 2018

Нет.

Чтобы получить результат асинхронной операции, вы используете блоки.

static func getTilesPerRow (@escaping completion: (Int?)->Void ) {

    let user = Auth.auth().currentUser
    guard let uid = user?.uid else {
        completion(nil)
    }
    var ref: DatabaseReference!
    ref = Database.database().reference()
    let userRef = ref.child("user").child(uid)

    userRef.child("tilesPerRow").observeSingleEvent(DataEventType.value, with: { (snapshot) in
        // Get user value
        print("now inside the observe thing------------------")
        let value = snapshot.value as? NSDictionary
        let num = snapshot.value as? Int ?? 0
        completion(num)

    }) { (error) in
        print("there was an error!!!!!!!!!!!!!!!!!")
        print(error.localizedDescription)
        completion(nil)
    }
}

Когда результаты будут готовы, вы получите уведомление через блок.В случае успеха вы получаете фактические num, которые вы ищете, или nil при возникновении любой ошибки.

Даже вы можете различить, что это за ошибка, добавив дополнительный параметр в список параметров в completionblock.

Вы также можете использовать протокол, но для этого требуется больше знаний, например, в каком классе находится этот код, кто является вызывающим объектом такого рода вещей.Установите цель протокола для вызывающей стороны, и после завершения вызванный метод запустит другой метод протокола, основанный на ошибке или успешном случае.

Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...