swift 将URL数组转换为UIImage数组

mspsb9vt  于 2023-03-16  发布在  Swift
关注(0)|答案(3)|浏览(258)

我有一个链接到图像文件的URL数组,我如何将它们存储到一个UIMages数组中?

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)
slwdgvem

slwdgvem1#

最简单的解决方案是使用Data(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)
}

一个更好的解决方案是异步并行下载图像,我已经使用PromiseKit编写了一个UIImage扩展:

extension UIImage {
    class func downloadedAsync(fromUrl url: URL)->Promise<UIImage> {
        return Promise{ fulfill, reject in
            URLSession.shared.dataTask(with: url, completionHandler: { data, response, error in
                guard let data = data, error == nil else {
                    reject(error!); return
                }
                guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                    reject(NSError(domain: "Wrong HTTP response code when downloading image asynchronously",code: (response as? HTTPURLResponse)?.statusCode ?? 1000));return
                }
                guard let mimeType = response?.mimeType, mimeType.hasPrefix("image"), let image = UIImage(data: data) else {
                    reject(NSError(domain: "No image in response", code: 700)); return
                }
                fulfill(image)
            }).resume()
        }
    }
}

调用它是为了一个链接数组,如下所示:

var imageDownloadTasks = links.flatMap{ link in
    guard let url = URL(string: link) else {return nil}
    return UIImage.downloadedAsync(fromUrl: url)
}

然后履行承诺:

when(fulfilled: imageDownloadTasks).then{ images in
    //use the images, images is of type [UIImage]
}
de90aj5v

de90aj5v2#

也许你可以尝试函数式编程用途:Map关闭...

links.map({
    if let imageData = try? Data(contentsOf: URL(string: $0)!) {
        UIImage(data: imageData)
    }
})

但是你必须知道如果你的链接是错误的,它会崩溃。所以,我建议你做一些防范,以防止这些崩溃。像这样...

guard let url = URL(string: $0) else { return nil }
a14dhokn

a14dhokn3#

for img in links {
        if let data = try? Data(contentsOf: URL(string: img)!) {
            let image = UIImage(data: data)
            imageArray.append(image!)
        }
    }

相关问题