我在collectionview
中使用2个网址显示2张图片,如此...
var sampleURLArray: [NSURL] = []
sampleURLArray = [NSURL(string: "http://myApp.abc.com/products/123_45_6_image_123456")!,NSURL(string: "http://myApp.abc.com/products/789_45_6_image_654321")!]
我正在迭代URL并将图像分配给一个像这样的数组......
for imageNumber in self.sampleURLArray {
let imageurl1 = imageNumber
let url = imageurl1
let data = try? Data(contentsOf: url as URL)
self.sampleImageView.image = UIImage(data: data!)
self.arrayOfURLImages.append(self.sampleImageView.image!)
}
现在可以正确显示图像。但我不是以这种硬编码的方式显示图像,而是我必须从我正在做的json
响应中显示来自网址的图像...
if let projectData = result["Productdata"] as? [[String:Any]] {
let productIds = projectData.flatMap({ $0["product_id"] as? String })
let images = projectData.flatMap({ $0["product_images"] as? [[String: Any]] }).flatMap({ $0 })
let imageIds = images.flatMap({ $0["image"] as? String })
self.appDelegate.commonArrForCollectionViewImgs = imageIds //I'll get each URL from self.appDelegate.commonArrForCollectionViewImgs
}
//CommonArrForCollectionViewImgs is set as var commonArrForCollectionViewImgs = [String]()
for imageNumber in self.appDelegate.commonArrForCollectionViewImgs {
let imageurl1 = imageNumber
let url = URL(string: imageurl1)
print(url)
if let dataOfUrl = try? Data(contentsOf: url!) {
let data = dataOfUrl
self.sampleImageView.image = UIImage(data: data)
}
self.arrayOfURLImages.append(self.sampleImageView.image!)
}
但是当这样做时,图像不会显示在collectionview
中,但我可以正确地解析所有网址。另外,如果我在API请求中获得成功,我正在进行json解析。我无法弄清问题是什么。这是否必须对collectionview
的设置位置做任何事情......?
答案 0 :(得分:0)
据我所知,您正在使用Data(contentsOf: url!)
初始化程序来获取远程资源。此方法仅用于本地资源。不要误解URL部分。 URL也可以指向本地资源。
根据Apple documentation
重要强>
请勿使用此同步方法来请求基于网络的网址。对于基于网络的URL,此方法可以在慢速网络上阻止当前线程持续数十秒,从而导致用户体验不佳,而在iOS中,可能会导致应用程序被终止。
相反,对于非文件网址,请考虑使用 NSURLSession 类的
dataTask(with:completionHandler:)
方法。有关详细信息,请参阅URL Session Programming Guide。
但是,如果你真的想使用这种方法,你可以像这样获取你的资源。
DispatchQueue.global(qos: .background).async
{
for url in urls {
let data = try? Data(contentsOf: url!)
self.images.append(UIImage(data: data!)!)
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
}