Arrays UIImage来自具有URL的数组
我目前正在开发一个从JSON检索url的应用程序,并使用url创建一些ImageView。 当我解码JSON时,我将每个URL存储到一个数组中 问题是,如何为数组中的每个URL创建ImageView 这是我的代码:Arrays UIImage来自具有URL的数组,arrays,json,swift,uiimageview,Arrays,Json,Swift,Uiimageview,我目前正在开发一个从JSON检索url的应用程序,并使用url创建一些ImageView。 当我解码JSON时,我将每个URL存储到一个数组中 问题是,如何为数组中的每个URL创建ImageView 这是我的代码: if(success == 1) { DataFromJSon = jsonData["objects"] as! NSArray repos.removeAll() for one in DataFr
if(success == 1)
{
DataFromJSon = jsonData["objects"] as! NSArray
repos.removeAll()
for one in DataFromJSon {
let repo = Repository(jsonData: one as! [String : AnyObject])
repos.append(repo)
}
for repo in repos {
lines.insert(repo.picture_url, atIndex: i)
dump(lines)
i++
}
//Construct the imgUrl to get an image URL for the pages
if let urlString: NSString = MyArray {
if let url = NSURL(string: urlString as String) {
if let data = NSData(contentsOfURL: url) {
newCard.image = UIImage(data: data)!
newCard.content = titleApp
newCard.desc = prixApp
self.data.append(newCard)
NSLog("fetch new data")
}
}
}
}
谢谢大家!
注意:
以下是一个最低限度的工作示例
var urls = [NSURL]()
urls.append(NSURL(string: "https://yourimage1")!)
urls.append(NSURL(string: "https://yourimage2")!)
for url in urls {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
if let data = NSData(contentsOfURL: url) {
let image = UIImage(data: data)!
let view = UIImageView(image: image)
dispatch_async(dispatch_get_main_queue()) {
// Display your view here
}
}
}
}
正如@Abizern所提到的,您应该将数据下载放在后台队列中,并使用主队列更新UI。您可以通过设置UIImageView的大小,然后根据需要在contentMode属性上使用.scaleSpectFit
或.scaleSpectFill
来缩放图像
编辑
我刚刚用您提供的imagelinks对其进行了测试,代码运行良好
var urls = [NSURL]()
urls.append(NSURL(string: "http://www.parkers.co.uk/Images/PageFiles/74655/firstdrive9.jpg")!)
urls.append(NSURL(string: "http://www.rsiauto.fr/images/BMW/330-Ci/330-Ci-1.jpg")!)
var i = 0
let width = self.view.frame.width/2
let height = self.view.frame.height
for url in urls {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
if let data = NSData(contentsOfURL: url) {
let image = UIImage(data: data)!
let frame = CGRectMake(CGFloat(i++)*width, 0, width, height)
i++
let view = UIImageView(image: image)
view.frame = frame
view.contentMode = .ScaleAspectFit
view.layer.masksToBounds = true
view.backgroundColor = UIColor.redColor()
dispatch_async(dispatch_get_main_queue()) {
self.view.addSubview(view)
print("Done")
}
}
}
}
这里是截图
请告诉我,如果让data=NSData(contentsofull:url)在主线程上运行,您没有运行
?实际上,我在主线程上使用它,至少,我认为,问题出在哪里?您在主线程上运行了一个长时间运行的进程,这会阻塞主线程并使UI无响应。由于这个原因,网络操作通常在后台线程上执行。嗯,是的,我理解,你是对的,我使用这个函数,但在我另一个类的另一个线程中。但这并不是很重要,我的应用程序不在prod中,只是为了测试,但谢谢你的建议:)你好,谢谢你的代码,我已经更改了代码,以便在后台队列中进行网络操作。此外,我尝试了你的解决方案,但不起作用,我得到了两个图像视图,但具有相同的图片。对于相同的图片,你是什么意思?是否将它们放在UIView上显示?请查看我编辑的文章。它总是显示相同的图片,而不是论文:;但是你看过GIF吗?我尝试实现“Swype手势”,顺便说一下,我不能使用子视图。对于每个图像,我称其为“NewCard.image”。我认为循环失败是因为有时我成功地显示了两个不同的图片,但有时没有。如果在分配时,newcard始终是同一个实例,那么当然,在设置图像时,每次都会覆盖它。