即使在将Json附加到数组后,数组也会打印空白

时间:2018-12-27 04:58:22

标签: swift alamofire

我已将JSON附加到数组中,当我从viewdidload或其他地方打印数组时,它显示为空白。

我创建了一个用于获取数据的自定义函数,并在viewdidload中对其进行了调用。

以下是我的完整代码:

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    var Usernames = NSMutableArray()
    var emails = [String]()

    let url_Posts = "https://jsonplaceholder.typicode.com/posts"
    let url_Users = "https://jsonplaceholder.typicode.com/users"

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchJSONData()
        print("usernames are",(Usernames))
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return Usernames.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        //TableView Codes
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PostsCell
        cell.lblEmail.text = self.emails[indexPath.row]
        cell.lblUsername.text = self.Usernames[indexPath.row] as! String
        return cell
    }

    func fetchJSONData() {

        Alamofire.request(url_Users).responseJSON   {
        (response) in

            if let rawData = response.result.value as! [[String:Any]]? {

                for one in rawData {

                    let name = one["name"]
                   self.Usernames.add(name!)

                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您需要在此处写一个Returning data from async call in Swift function

或在此处重新加载表格

 for one in rawData {   
  let name = one["name"]
   self.Usernames.add(name!)
 }
 self.tableView.reloadData()

最好有一个模型数组而不是单独的数组,并使用Codable

struct Root : Decodable {
   let name,email:String
}

func fetchJSONData(completion:@escaping([Root]?) -> () ) {

     Alamofire.request(url_Users).responseData(completionHandler : { (response) in
    switch response.result {
    case .success( let data):
        // I want to append the user struct by the user data collected from JSON
        print(response.result.value!)
        do {
            let res = try JSONDecoder().decode([Root].self,from:data)
            completion(res)
        }
        catch {
            print(error)
            completion(nil)
        }

    case .failure(let error):
        print (error)
         completion(nil)
    }

  }) 
}

致电

fetchJSONData {  (arr) in

  if let res = arr {
    print(res)
  }
}