解析数据的问题(名称到图像)

时间:2017-09-28 13:35:08

标签: ios swift

我的json回复看起来像这样......

{
    "success": 1,
    "TotalRevenue": “123.12 K",
    "Productdata": [
        {
            "product_id": "5",
            "product_name": “abc”
            "product_images": [
                {
                    "id": "938",
                    "image_url": "http://myApp.direct.com/public165_1_image_15",
                    "is_default": "1"
                }

            ]
        }

这就是我解析数据的方式......

if let projectData = result["Productdata"] as? [[String:Any]] {

 let images = projectData.flatMap({ $0["product_images"] as? [[String: Any]] }).flatMap({ $0 })

let productName = projectData.flatMap({ $0["product_name"] as? String })
self.arrayOfNames = productName
self.arrayOfId = imageIds

}

我已经提取了名称并将它们分配给上面的数组。然后我从包含所有名称的数组中取出每个名称,如此...

                    for names in self.arrayOfNames {
                                DispatchQueue.global(qos: .background).async
                                    {
                                        self.theNameArray.append(names)

                                        DispatchQueue.main.async {
                                            self.collectionView.reloadData()
                                        }
                                }
                            }

最后,为了能在colletionview中的每张图片下获得相应的名称,我这样做......

我无法弄明白我如何将product name abc分配给id 938.我尝试过这样的事情......

cell.recipeImageView.image = self.arrayOfURLImages[indexPath.row]
cell.nameLabel.text = self.arrayOfNames[indexPath.row]

在上面两行代码中,第一行显示了图像。但我的问题是名称没有正确显示,即图像的相应名称没有显示...而是任何随机名称都分配给任何图像。如何在正确的图像下获得正确的名称。

2 个答案:

答案 0 :(得分:4)

从不使用多个数组作为表/集合视图数据源。苏所有建议的教程!

我们讨论的是面向对象的语言,因此使用自定义结构,这是将JSON解析为数据模型的强烈推荐方法。

创建两个结构ProductProductImage

struct ProductImage {
    let id : String
    let url : URL
    let isDefault : Bool
}

struct Product {
    let name : String
    let id : String
    var images = [ProductImage]()

    init(name : String, id : String) {
        self.name = name
        self.id = id
    }

    mutating func add(image :ProductImage) {
        images.append(image)
    }
}

创建数据源数组

var productData = [Product]()

解析数据

if let projectData = result["Productdata"] as? [[String:Any]] {
    for anItem in projectData {
        guard let name = anItem["product_name"] as? String,
            let id = anItem["product_id"] as? String else { continue }

        var product = Product(name: name, id: id)
        if let images = anItem["product_images"] as? [[String:String]] {
            for image in images {
                guard let imageId = image["id"],
                    let url = image["image_url"],
                    let isDefault = image["is_default"] else { continue }

                let productImage = ProductImage(id: imageId,
                                                url: URL(string: url)!,
                                                isDefault: isDefault == "1")

                product.add(image: productImage)
            }
        }
        productData.append(product)
    }
}

Swift 4引入了内置的JSON en- /解码,几乎可以摆脱整个解析代码。

答案 1 :(得分:0)

您的模型应该有产品数组,其中每个产品都有图像数组。所以每件产品都会有它的名字和图像。