2016-08-19 2 views
0

Я хочу проверить, есть ли пользователь с выбранным именем пользователя в Firebase, и я создал функцию checkUsernameAlreadyTaken(username: String) -> Bool, которая делает это. Вот код пф функции:Возвращаемое значение из асинхронного метода базы данных Firebase

func checkUsernameAlreadyTaken(username: String) -> Bool { 
    databaseRef.child("usernames").child("\(username)").observe(.value, with: { (snapshot) in 
     print(username) 
     if snapshot.exists() { 
      print("Snapshot exist") 
      self.alreadyTaken = true 
     } 
    }) 
    if alreadyTaken == true { 
     print("Username already taken") 
     return false 
    } 
    else { 
     return true 
    } 

} 

Проблема заключается в том, что метод observe(_ eventType: FIRDataEventType, with block: (FIRDataSnapshot) -> Void) -> Uint является метод асинхронной и поэтому я не могу использовать стратегию вы можете увидеть выше. Но я не могу вернуть значение из метода Firebase, потому что это метод void ...
Как я могу решить эту проблему?

Еще одна вещь. Как я могу вернуть false также, если есть ошибка подключения или нет соединения с сервером?

+0

Извините, если я сделал некоторые ошибки с язык, я итальянский студент – ale00

ответ

3

Вы должны использовать асинхронный обработчик ЗАВЕРШЕНИЯ себя и проверить, есть ли подключение к Интернету:

func checkUsernameAlreadyTaken(username: String, completionHandler: (Bool) ->()) { 
    databaseRef.child("usernames").child("\(username)").observe(.value, with: { (snapshot) in 
     print(username) 
     if snapshot.exists() { 
      completionHandler(false) 
     } else { 
      let connectedRef = FIRDatabase.database().reference(withPath: ".info/connected") 
      connectedRef.observe(.value, with: { snapshot in 
       if let connected = snapshot.value as? Bool, connected { 
        completionHandler(true) 
       } else { 
        completionHandler(false) 
        // Show a popup with the description 
        let alert = UIAlertController(title: NSLocalizedString("No connection", comment: "Title Internet connection error"), message: NSLocalizedString("No internet connection, please go online", comment: "Internet connection error saving/retriving data in Firebase Database"), preferredStyle: .alert) 
        let defaultOkAction = UIAlertAction(title: NSLocalizedString("No internet connection, please go online", comment: "Internet connection error saving/retriving data in Firebase Database"), style: .default, handler: nil) 
        alert.addAction(defaultOkAction) 

        self.present(alert, animated: true, completion: nil) 
       } 
      }) 
     } 
    }) 
} 

Тогда вы называете метод с:

checkIfUserExists(username: text, completionHandler: { (value) in 
    // ... 
}) 
Смежные вопросы