如何使用 Alamofire 更改全局变量?

Posted

技术标签:

【中文标题】如何使用 Alamofire 更改全局变量?【英文标题】:How to change global variable with Alamofire? 【发布时间】:2019-05-03 18:27:53 【问题描述】:

我想用 Alamofire 获取用户数据并将其填充到 tableView。

我的代码:

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 我有这个打印:

viewDidLoad 中的self.userEntries.count is: 0 //一定是2!!!

ue.count 为:2

self.userEntries.count in this block: 2

并且在 numberOfRowsInSection 方法中返回 0,因为

viewDidLoad 中的self.userEntries.count is: 0 //一定是2!!!

如何正确设置'self.userEntries'变量(数组)以便在tableView方法中使用?

【问题讨论】:

【参考方案1】:

由于获取数据的调用是异步的,因此您需要在完成内重新加载表

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()

【讨论】:

以上是关于如何使用 Alamofire 更改全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire + SwiftyJSON 定义全局变量

如何使局部变量(在函数内部)全局[重复]

iPhone,如何使用 App Delegate 变量使其可以像全局变量一样使用?

如何使用 Alamofire 的 RequestAdapter 将 firebase ID 令牌设置为全局标头?

如何从函数内部更改全局变量的值?

全局变量和 Alamofire 的问题