Нужно вызвать метод ПОСЛЕ доступа к данным из firebase - PullRequest
0 голосов
/ 04 июля 2018

Я обращаюсь к данным, хранящимся в базе данных реального времени firebase, но после доступа к данным я хочу вызвать метод, который настроит представление.

func fetchPostData(){
    Database.database().reference().child("Posts").observe(.childAdded, with: {(snapshot) in

        if let dictionary = snapshot.value as? [String: Any]{
            let post = Posts()
            if let val = dictionary["name"] as? String{
                post.objName = val
            }
            if let val = dictionary["price"] as? String{
                post.objPrice = val
            }
            if let val = dictionary["summary"] as? String{
                post.objSummary = val
            }
            if let val = dictionary["username"] as? String{
                post.postUsername = val
            }
            self.posts.append(post)

        }
        setUpView()

    }, withCancel: nil)

}

Проблема заключается в том, что, как и все API-интерфейсы Firebase, он асинхронный, поэтому метод будет возвращен сразу после вызова. Но я хочу, чтобы setUpView() вызывался только один раз, после того, как все данные были обработаны и сохранены. Я попытался проверить, существует ли версия этой функции, которая имеет завершение, и, к сожалению, ее не существует.

Так есть ли способ, что я могу вызвать этот метод только после того, как все данные были сохранены?

Пожалуйста, помогите, мне это нужно !!!

Заранее спасибо

1 Ответ

0 голосов
/ 04 июля 2018

Я думаю, вам нужно сделать что-то вроде этого

func fetchPostData(success:@escaping (Bool) -> Void){
        Database.database().reference().child("Posts").observe(.childAdded, with: {(snapshot) in

            if let dictionary = snapshot.value as? [String: Any]{
                /// Let get posts First
                let post = Posts()
                if let val = dictionary["name"] as? String{
                    post.objName = val
                }
                if let val = dictionary["price"] as? String{
                    post.objPrice = val
                }
                if let val = dictionary["summary"] as? String{
                    post.objSummary = val
                }
                if let val = dictionary["username"] as? String{
                    post.postUsername = val
                }
                /// Post Retrieved and added in  array
                self.posts.append(post)
                /// Return this function when you are sure data is retrieved from DB
                success(true)
            }
        }, withCancel: nil)      
    }

Использование

fetchPostData { (success) in
    if success {
        /// You did received bool as yes
        /// Perform required Task
        setUpView()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...