Как изменить глобальную переменную с Alamofire? - PullRequest
0 голосов
/ 03 мая 2019

Я хочу получить пользовательские данные с помощью Alamofire и заполнить их таблицей.

Мой код:

class MainTableViewController: UITableViewController {
    var userEntries = [UserEntries]()

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchUserData { (ue) in
            print("ue.count is: \(ue.count)")
            self.userEntries = ue
            print("self.userEntries.count in this block: \(self.userEntries.count)")
        }

        print("self.userEntries.count in viewDidLoad is: \(self.userEntries.count)")
    }

    func fetchUserData(completion: @escaping ([UserEntries]) -> Void) {
        //another code...

        Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding(destination: .httpBody), headers: headers).responseJSON { (response) in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                let data = json["mydata"][0].array
                var userEntries = [UserEntries]()
                //I have 2 records only        
                data?.forEach({ (p) in
                    userEntries.append(UserEntries(id: p["id"].stringValue, date: p["date"].stringValue, text: p["text"].stringValue))
                })
                completion(userEntries)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.userEntries.count //it is return 0...
    }
}

В viewDidLoad у меня есть эти распечатки:

self.userEntries.count в viewDidLoad: 0 // должно быть 2 !!!

ue.count равно: 2

self.userEntries.countв этом блоке: 2

И в методе numberOfRowsInSection вернуть 0, потому что

self.userEntries.count в viewDidLoad: 0 // должно быть 2 !!!

Как правильно установить переменную (массив) self.userEntries для использования в методах tableView?

1 Ответ

1 голос
/ 03 мая 2019

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

fetchUserData { (ue) in
   print("ue.count is: \(ue.count)")
   self.userEntries = ue
   print("self.userEntries.count in this block: \(self.userEntries.count)")
   self.tableView.reloadData()
}
...