2017-02-01 2 views
0

Я пытаюсь получить доступ к переменной вне функции, я попытался объявить переменную вне класса, но она продолжает отображать начальное значение в объявлении, а не значение внутри функции, здесь мой код, мне нужно, чтобы получить доступ databaseScoreдоступ к переменной вне функции - swift

func getDatabaseScore()-> Int{ 
    let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!) 

    ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in 
     if var userDict = snapshot.value as? [String:Int] { 
      //Do not cast print it directly may be score is Int not string 
      var databaseScore = userDict["score"] 

     } 


    }) 

    return databaseScore 

} 
+0

@ EICaptainv2.0 если это ответ, пожалуйста, добавьте его в таком –

+3

Это знаменитый * асинхронному ловушка *. Невозможно вернуть что-то из метода, содержащего асинхронную задачу. – vadian

+0

Не могли бы вы добавить еще один код на свой вопрос. В частности, покажите закрывающий объект и где вы вызываете 'getDatabaseScore()' –

ответ

1

Как уже отмечались в комментариях это невозможно вернуть что-то сформировать метод, содержащий асинхронный задачу.

Вам нужен блок завершения, например

func getDatabaseScore(completion: (Int?)->()) { 
    let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!) 

    ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in 
     if let userDict = snapshot.value as? [String:Int] { 
      //Do not cast print it directly may be score is Int not string 
      completion(userDict["score"]) 
     } 
     completion(nil) 
    }) 
} 

getDatabaseScore() { score in 
    guard let score = score else { return } 
    // do something with unwrapped "score" 
} 
+0

, это дает мне эту ошибку: Неустранимая ошибка: неожиданно найден nil при развертывании необязательных значений –

+0

Мой добавленный код не может быть поврежден, скорее всего, авария произошла в 'let ref2 ...' строка. Используйте дополнительные привязки, например, в закрытии, чтобы избежать сбоя. – vadian

+0

приложение crash here: self.getDatabaseScore() {оценка в // сделайте что-нибудь с "счетом" если оценка!

1

Вы делаете операцию асинхронной так getDatabaseScore возвращается до того observeSingleEvent завершается. Вы можете посмотреть на что-то вроде этого ...

class MyClass { 

    var databaseScore: Int = 0 

    func getDatabaseScore() { 

     let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!) 

     ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in     
      if let userDict = snapshot.value as? [String:Int] { 
       print(userDict["score"]) // Confirm you have the a value 
       self.databaseScore = userDict["score"] 
      } 
     } 
    } 
+0

databaseScore все еще удерживаете 0, его значение объявления –

+0

Возможно, 'userDict [" score "]' содержит 0? Попробуйте добавить 'print' там, чтобы подтвердить –

+0

нет, это не так, я тоже попробовал его с печатью –

Смежные вопросы