无法在数组中添加json键值,为什么要迅速

问题描述 投票:0回答:1

我具有带有图像和ID的集合视图。在这里,我无法在数组中添加所有ID。我在日志中获得单个ID。但是我无法在数组中添加所有ID。如果我打印idArray它显示nil为什么。我已将id作为字符串。如何在数组中添加所有json ID。

任何人都可以在我的代码中为我提供帮助。

这是我的json结构

{
"financer": [
{
"id": "45",
"icon": "https://hello.com//images/img1.png"
}
{
"id": "40",
"icon": "https://hello.com//images/img2.png"
}
.
.
]
}

这是我的代码:

class HomeViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UITextFieldDelegate {

    @IBOutlet weak var collectionView: UICollectionView!
    var itemsArray = [JsonData]()
    var idArray = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()

        homeServiceCall()
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return itemsArray.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell

        let aData = itemsArray[indexPath.row]
        cell.paymentLabel.text = aData.typeName
        if let url = NSURL(string: aData.iconHome ?? "") {
            if let data = NSData(contentsOf: url as URL) {
                cell.paymentImage.image = UIImage(data: data as Data)
            }
        }
        return cell
    }

    //MARK:- Service-call

    func homeServiceCall(){

        let urlStr = "https://dev.com/webservices/getfinancer"
        let url = URL(string: urlStr)
        URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in

            guard let respData = data else {
                return
            }
            guard error == nil else {
                print("error")
                return
            }
            do{
                DispatchQueue.main.async {
                    self.activityIndicator.startAnimating()
                }
                let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
                //print("the home json is \(jsonObj)")
                let financerArray = jsonObj["financer"] as! [[String: Any]]

                for financer in financerArray {

                    let id = financer["id"] as? String
                    let pic = financer["icon"] as? String
                    let typeName = financer["tpe"] as! String
                    print("home financer id \(String(describing: id))")
                    self.idArray.append(id ?? "")
                    print("the home financer idsArray \(self.idArray.append(id ?? ""))")

                    self.itemsArray.append(JsonData(icon: pic ?? "", tpe: typeName))
                }

                DispatchQueue.main.async {
                    self.collectionView.reloadData()
                }
            }
            catch {
                print("catch error")
            }
        }).resume()
    }
}
arrays json swift dictionary
1个回答
0
投票

不要使用多个数组作为数据源。这是非常糟糕的做法。

创建两个符合Decodable的结构

struct Root : Decodable {
    let financer : [Financer]
}

struct Financer : Decodable {
    let id : String
    let icon : URL
}

声明数据源数组

var itemsArray = [Financer]()

用[替换homeServiceCall

func homeServiceCall() {

    let url = URL(string: "https://dev.com/webservices/getfinancer")
    URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
        if let error = error { print(error); return }

        do {
            DispatchQueue.main.async {
                self.activityIndicator.startAnimating()
            }
            let result = try JSONDecoder().decode(Root.self, from:  data!)
            self.itemsArray = result.financer
            DispatchQueue.main.async {
                self.collectionView.reloadData()
            }
        }
        catch {
            print(error) -- print always the error instance.
        }
    }).resume()
}

cellForRow中用[获得id

let aData = itemsArray[indexPath.row]
cell.paymentLabel.text = aData.id

重要注意事项:

永远不要使用同步Data(contentsOf从远程URL加载数据。使用一个API,该API << a >>同步加载数据并缓存图像

© www.soinside.com 2019 - 2024. All rights reserved.