@sportredwhite

Почему в замыкание не переписывается значение?

Подскажите плз, почему amountGame равно nil?

class MyGameTVC: UITableViewController {

    var currentUser: FIRUser!
    var ref: FIRDatabaseReference!
    var amountGame: Int!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        currentUser = FIRAuth.auth()?.currentUser
        
        ref = FIRDatabase.database().reference().child("users/\(currentUser.uid)/idMyGame")
        
        ref.observeSingleEvent(of: .value, with: {  snapshot in
            if let dict = snapshot.value as? [String: AnyObject] {
                self.amountGame = dict.count
            }
        })
        
        print(amountGame) // ?
        
    }
}
  • Вопрос задан
  • 219 просмотров
Пригласить эксперта
Ответы на вопрос 2
ManWithBear
@ManWithBear
Swift Adept, Prague
Потому что Optional инициализируется по дефолту со значением nil.
Почему оно не меняется в кложуре? Скорее всего оно асинхронное и выполняется после вашего принта
Ответ написан
@nanosem
iOS Developer
Во-первых closure's передавай ссылку на self

stackoverflow.com/questions/24320347/shall-we-alwa...

ref.observeSingleEvent(of: .value, with: { [weak self]  snapshot in
            if let dict = snapshot.value as? [String: AnyObject] {
                self?.amountGame = dict.count
            }
        })


Во-вторых, firbase и подобные сервисы работают в background потоках,
А твое присваивание лежит в основном (main потоке)

Решение: (Вернее одно из них)
Использовать DispatchGroup

class MyGameTVC: UITableViewController {

    var currentUser: FIRUser!
    var ref: FIRDatabaseReference!
    var amountGame: Int!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        currentUser = FIRAuth.auth()?.currentUser
        
        ref = FIRDatabase.database().reference().child("users/\(currentUser.uid)/idMyGame")
        
        let group = DispatchGroup() 
        group.enter()

        ref.observeSingleEvent(of: .value, with: { [weak self] snapshot in
            if let dict = snapshot.value as? [String: AnyObject] {
                self?.amountGame = dict.count
            }

        group.leave()

        })
        group.notify(queue: DispatchQueue.main) {
              print(amountGame) // ?
        }
        
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы