Swift 将URL数组转换为UIImage数组
我有一个链接到图像文件的URL数组,如何将它们存储到UIImage数组中Swift 将URL数组转换为UIImage数组,swift,Swift,我有一个链接到图像文件的URL数组,如何将它们存储到UIImage数组中 var imagesArray = [UIImage]() let links = ["http://example.com/image1.jpg","http://example.com/image2.jpg"] as [String] 必须有一个简单的解决办法。 如果是一张图片,我可以做如下操作: let url = URL(string: link2image!)! let imageData = try? Da
var imagesArray = [UIImage]()
let links = ["http://example.com/image1.jpg","http://example.com/image2.jpg"] as [String]
必须有一个简单的解决办法。
如果是一张图片,我可以做如下操作:
let url = URL(string: link2image!)!
let imageData = try? Data(contentsOf: url)
let image = UIImage(data: imageData!)!
self.image.append(image)
最简单的解决方案是通过数组进行迭代,并使用
数据(contentsOf:)
同步下载图像,但是,由于同步执行,这将是非常不够的
let images = links.flatMap{ link->UIImage? in
guard let url = URL(string: link) else {return nil}
guard let imageData = try? Data(contentsOf: url) else {return nil}
return UIImage(data: imageData)
}
更好的解决方案是并行异步下载图像,我已经为此编写了一个UIImage
扩展,使用:
然后履行承诺:
when(fulfilled: imageDownloadTasks).then{ images in
//use the images, images is of type [UIImage]
}
也许你可以尝试函数式编程使用:映射闭包
links.map({
if let imageData = try? Data(contentsOf: URL(string: $0)!) {
UIImage(data: imageData)
}
})
但你必须知道,如果你的链接是错误的,它会崩溃。所以,我建议你做些防护措施来防止这些碰撞。像这样
guard let url = URL(string: $0) else { return nil }
您是否考虑过使用forEach/map函数?像
let images=url.map({(url)在let images=try?Data(contentsOf:url);…})
或var images:[UIImage]=[];url.forEach({(url)in let img=Data(contentsOf:url);…self.images.append(img);})
知道我的意思吗?在数组中存储一堆图像一开始是个坏主意。是的,这可能真的可以完成任务。我会试试看会发生什么,谢谢。一定有一个简单的解决方案。
你需要学习异步编程的基础知识。@JAL你也推荐PromiseKit吗?我只是使用苹果的原生防护和异步等。谢谢大卫,我不确定PromiseKit,因为我想避免使用太多的框架,但我会尝试第一个解决方案。CheersI会认真推荐使用第二种解决方案,因为第一种解决方案由于同步执行而不理想。如果你经常处理异步请求,PromiseKit
真是个怪兽,它会让你的生活变得更轻松。如果你发现我的答案是有用的,请考虑接受它。ToeUpKIT对像IMO这样的任务来说是多余的。这可以用包括在原生可可SDK中的工具来完成,比如NSURLISTIN。是的,使用承诺是非常理想的,尤其是对于这种用例。我建议试一试。或者您可以尝试一种本机方法,但异步地执行操作可能是使用NSURL会话作为@JALsuggested@JAL如果只是这个任务,那么是的,可以使用本机资源解决,但它需要更多的代码,并且更容易出错。特别是对于不熟悉异步编程的人来说,使用内置框架解决此类问题可能是一件痛苦的事情。更好的方法是将字符串平面映射到URL,然后再平面映射到数据/图像。好的,明白了,我会试试
links.map({
if let imageData = try? Data(contentsOf: URL(string: $0)!) {
UIImage(data: imageData)
}
})
guard let url = URL(string: $0) else { return nil }