微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法将 JSON 解析中的值附加到 Swift 中的数组

如何解决无法将 JSON 解析中的值附加到 Swift 中的数组

我正在使用 https://jsonplaceholder.typicode.com 并尝试创建专辑列表。我尝试关注 the example here,但专辑标题列表没有显示在 TableView 上。我错过了什么?

class AlbumTableVC: UITableViewController {

var albums = [Album]()

override func viewDidLoad() {
    super.viewDidLoad()
    fetchAlbums()
}

func fetchAlbums() {
    AF.request("https://jsonplaceholder.typicode.com/albums").responseJSON { (response) in
        switch response.result {
        case .success(let value):
            let json = JSON(value)
            
            for value in json.arrayValue {
                let id = value.dictionaryValue["id"]!.int
                let userId = value.dictionaryValue["userId"]!.int
                let title = value.dictionaryValue["title"]!.string
                
                let album = Album(id: id,userId: userId,title: title)
                self.albums.append(album)
            }
        case .failure(let error):
            print(error)
        }
    }
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    return albums.count
}

override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "AlbumCell",for: indexPath)
    
    let album = albums[indexPath.row]
    cell.textLabel?.text = album.title
    
    return cell
}}

解决方法

填充数据源(异步)后,您必须重新加载表视图

for value in json.arrayValue {
    let id = value.dictionaryValue["id"]!.int
    let userId = value.dictionaryValue["userId"]!.int
    let title = value.dictionaryValue["title"]!.string
    
    let album = Album(id: id,userId: userId,title: title)
    self.albums.append(album)
}
self.tableView.reloadData()

考虑放弃 SwiftyJSON 以支持 Codable。甚至 Alamofire 也支持它。

看看这个简化的代码,你只需要让Album采用Decodable

struct Album : Decodable { ...

AF.request("https://jsonplaceholder.typicode.com/albums").responseDecodable { (response : DataResponse<[Album],AFError>) in
    switch response.result {
    case .success(let value):
        self.albums = value
        self.tableView.reloadData()
        
    case .failure(let error):
        print(error)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。