Получить значение String из функции с закрытием в Swift

Я пытаюсь получить строковое значение из Firebase, чтобы получить каждое имя пользователя с уникальным UID, который передается функции, которая возвращает имя пользователя пользователя. Однако - так как пожарная базаObserveEvent вclosuresЯ не могу вернуть какое-либо значение обратно, потому что действия происходятасинхронный(?). Мне было интересно, если это был способ сделать это?

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

func GetUsername(uid:String) -> String {
    var username = String()
    firebase.child("Users").child(uid).observeSingleEventOfType(.Value) { (snapshot:FIRDataSnapshot) in

        username = snapshot.value!["Username"] as! String

    }

    return username
}

Очевидно, что это не работает, но я хочу иметь возможность получить данные, выполнив GetUsername ("whatevertheidmightbe"). Идеи?

 Leo Dabus16 июл. 2016 г., 10:52
Просто добавьте обработчик завершения
 Josh Caswell07 сент. 2017 г., 14:39
 askaale16 июл. 2016 г., 11:00
@LeoDabus Как это? func GetUsername (uid: String, callback: (String) -> String) {firebase.child ("Users"). child (uid) .observeSingleEventOfType (.Value) {(снимок: FIRDataSnapshot) в обратном вызове (snapshot.value! [ "DisplayName"] as! String)}} Я не могу заставить его работать, так или иначе ..
 adolfosrs16 июл. 2016 г., 15:50

Ответы на вопрос(1)

Решение Вопроса

Вам нужно создать обработчик завершения, как это

func GetUsername(uid:String , completion: (String) -> ()) {
    firebase.child("Users").child(uid).observeSingleEventOfType(.Value) { (snapshot:FIRDataSnapshot) in
    if let username = snapshot.value!["Username"] as? String
        completion(username)
    }
    else {
        completion("")
    }
}

И вызывать функцию так

self.GetUsername(str) { (name) -> () in
    if name.characters.count > 0 {
         print(name)
    }
    else {
         print("Not found")
    }
}
 askaale16 июл. 2016 г., 11:46
По крайней мере, я не могу, пытаясь напечатать это в консоли (не печатая это из функции, но используя вместо этого возврат).
 askaale16 июл. 2016 г., 11:45
Да, насколько я понимаю, вы не можете вернуть значение типа строки (в возвращаемом имени) в формате?
 Nirav D16 июл. 2016 г., 11:25
Имя пользователя уже в формате строки, проверьте ответ правильно.
 askaale16 июл. 2016 г., 11:52
Я имею в виду, что вместо того, чтобы вызывать функцию и заставлять ее печатать значение, я хочу сделать ее возвращаемым типом - немедленно возвращать строку вместо того, чтобы вызывать ее как функцию, а затем выводить значение. Подобно (uid: String) -> String, и получите имя пользователя, выполнив GetUsername ("uid") (который возвращает только строку.
 askaale16 июл. 2016 г., 11:18
Огромное спасибо. Еще один вопрос; Можно ли будет сделать его возвращаемым типом String? (Так что я могу легко вызвать GetUsername и получить имя пользователя в формате строки?
 askaale16 июл. 2016 г., 11:55
да ладно - я просто хотел быть уверен на 100%. Большое спасибо за Вашу помощь. Я принял ваш ответ сейчас.
 Nirav D16 июл. 2016 г., 11:47
Я не понимаю, что вы пытаетесь сказать.
 Nirav D16 июл. 2016 г., 11:54
Это невозможно, и ответ на этот вопрос вы уже дали из-за асинхронного поведения firebase.
 Nirav D16 июл. 2016 г., 11:31
@askaale Я отредактировал ответ, теперь ты получаешь представление об удаленииvoid так что вы можете ясно понять это. Здесь мы передаем строковое значение в обработчик завершения.
 askaale16 июл. 2016 г., 11:27
Да, я знаю - но я просто спрашивал, возможно ли сделать тип возврата типа String? Как я вижу, сейчас это Void (). У меня нет большого опыта работы с замыканиями, поэтому, насколько я знаю, это также может быть невозможно ..?

Ваш ответ на вопрос