Получение количества клеток после работы сети - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь получить count collectionViewCell из сетевого запроса, но значение оказывается всегда 0 (для которого я инициализировал переменную count). Я хочу, чтобы представление загружало ячейки после того, как я получил их счет из запроса getЧто я делаю не так? Я написал этот код после super.viewDidLoad().

DispatchQueue.global(qos:.background).async {
    let token = "---------------------------"
    let url = URL(string: "https:----------home.json?token="+token)!
    let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
        guard let data = data else { return }
        // print(String(data: data, encoding: .utf8)!)
        let jsonWithObjectRoot = try? JSONSerialization.jsonObject(with: data, options: [])
        //  print(json!)
        if let dictionary = jsonWithObjectRoot as? [String: Any] {
            if let data = dictionary["data"] as? [String:Any]{
                if let posts =  data["posts"] as? [Any]{
                    count = posts.count
                    //print(count) //the value here is 2 
                    for object in posts{

                        if let contentString = object as? [String: Any] {
                            print(contentString["title"] as! String)
                            //   print(contentString["entered"]as! String)
                        }
                    }
                }
            }

        }
    }
    task.resume()
    /* end Request */
    DispatchQueue.main.async{

        self.collectionView.reloadData()
        self.collectionView.collectionViewLayout.invalidateLayout()
    }
}

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы должны перезагрузить после получения data из сети

count = posts.count
//print(count) //the value here is 2 
DispatchQueue.main.async{
   self.collectionView.reloadData()
}
0 голосов
/ 18 сентября 2018

Классический асинхронный чехол.Ваши сетевые вызовы являются асинхронными, поэтому перезагрузка должна происходить при завершении сетевого вызова.

DispatchQueue.global(qos:.background).async {
    let token = "---------------------------"
    let url = URL(string: "https:----------home.json?token="+token)!
    let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
        guard let data = data else { return }
        // print(String(data: data, encoding: .utf8)!)
        let jsonWithObjectRoot = try? JSONSerialization.jsonObject(with: data, options: [])
        //  print(json!)
        if let dictionary = jsonWithObjectRoot as? [String: Any] {
            if let data = dictionary["data"] as? [String:Any]{
                if let posts =  data["posts"] as? [Any]{
                    count = posts.count
                    //print(count) //the value here is 2 
                    DispatchQueue.main.async{
                        self.collectionView.reloadData()
                        self.collectionView.collectionViewLayout.invalidateLayout()
                    }
                    for object in posts {
                        if let contentString = object as? [String: Any] {
                            print(contentString["title"] as! String)
                            //   print(contentString["entered"]as! String)
                        }
                    }
                }
            }
        }
    }
    task.resume()
    /* end Request */

}
...