Массив печатает пустой, даже после добавления в него Json - PullRequest
0 голосов
/ 27 декабря 2018

Я добавил 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 голосов
/ 27 декабря 2018

Вам нужно либо написать завершение как здесь Возвращение данных из асинхронного вызова в функции Swift

ИЛИ перезагрузить таблицу здесь

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

  }) 
}

Call

fetchJSONData {  (arr) in

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