Функция, которая возвращает значение из замыкания с завершением - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь написать функцию, которая возвращает значение из закрытия запроса Firebase.

К сожалению, я еще не полностью освоил замыкания и обработчики завершения.

Я хотел бы использовать и вызывать эту функцию следующим образом:

let name = userName(forUID: “UID01”)

, а не так:

let name = userName(forUID: "UID01") { name in
            print(name)
    }

Причина, по которой я хочу использовать этоЭто происходит потому, что эта функция будет вызываться во многих местах кода, и мне нравится сохранять мой код максимально чистым и лаконичным.Иначе, я могу объявить глобальную переменную и использовать self.name = name внутри тела функции.Но если, например, я вызову эту функцию 5 раз, мне придется объявить 5 глобальных переменных ...

Функция выглядит так:

func userName(forUID: String, completion: @escaping (_ name: String) -> ()) {
    var ref: DatabaseReference!
    ref = Database.database().reference()

    ref.child("users").child(forUID).observeSingleEvent(of: .value, with: { (snapshot) in
        let data = snapshot.value as? NSDictionary
        let name = data?["name"] as? String ?? ""
        completion(name)
        // ...
    })
}

1 Ответ

0 голосов
/ 17 мая 2018

Ваша вторая версия близка.Это должно быть примерно так:

userName(forUID: "UID01") { name in
  print(name)
}

Поскольку вы используете асинхронный метод Firebase для извлечения ваших данных, вы НЕ МОЖЕТЕ создать функцию, которая возвращает эти данные.Это не то, как работают асинхронные методы.

...