我的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]
在上面两行代码中,第一行显示了图像。但我的问题是名称没有正确显示,即图像的相应名称没有显示...而是任何随机名称都分配给任何图像。如何在正确的图像下获得正确的名称。
答案 0 :(得分:4)
从不使用多个数组作为表/集合视图数据源。苏所有建议的教程!
我们讨论的是面向对象的语言,因此使用自定义结构,这是将JSON解析为数据模型的强烈推荐方法。
创建两个结构Product
和ProductImage
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)
您的模型应该有产品数组,其中每个产品都有图像数组。所以每件产品都会有它的名字和图像。