Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将URL数组转换为UIImage数组_Swift - Fatal编程技术网

Swift 将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

我有一个链接到图像文件的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? 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 }