如何使用SDWebImage下载并保存CGImage
How to use SDWebImage to download and save CGImage
我正在尝试使用 SDWebImage 从外部 url 和 return 下载图像。我不想在视图上设置它。这是我正在使用的代码,但它不起作用。我 return 没有。但我知道我传递的 url 有效,因为我可以在浏览器中看到它。我究竟做错了什么?
func downloadImage() -> CGImage {
var myImage: CGImage?
let myUrl = URL(string: "my-url-here.com")
SDWebImageDownloader.shared.downloadImage(with: myUrl, completed: { (image, data, error, true) in
print("Completed")
if image != nil {
myImage = image?.cgImage
}
})
return myImage!
}
我也试过这个版本,同样没有成功:
func downloadImage() -> CGImage {
var myImage: CGImage?
let myUrl = URL(string: "my-url-here.com")
SDWebImageManager.shared.loadImage(with: myUrl, options: .continueInBackground, progress: { (received, expected, nil) in
print(received, expected)
}, completed: { (downloadedImage, data, error, SDImageCacheType, true, imageUrlString) in
DispatchQueue.main.async {
if downloadedImage != nil {
myImage = downloadedImage?.cgImage
}
}
})
return myImage!
}
SDWebImage 是一个异步库。你不能只是 return
结果。通常,人们会使用 @escaping
闭包将结果提供给调用者。例如
func downloadImage(completion: @escaping(CGImage?) -> Void) {
let url = URL(string: "https://my-url-here.com")!
SDWebImageDownloader.shared.downloadImage(with: url) { image, _, _, _ in
completion(image?.cgImage)
}
}
你会像这样使用它:
downloadImage { image in
guard let image = image else { return }
// use image here
}
// but not here
但让我们退后一步,看看整个模式。你说你想“保存”结果。如果你正在谈论将它保存到持久存储,你根本不想使用 CGImage
(或 UIImage
或其他)。这在计算上效率低下(将资产转换为图像然后返回 Data
以便您可以保存它),space 效率低下(您必须同时将整个资产加载到内存中),并且可能会引入问题(例如,如果您下载 JPG,转换为 CGImage
,然后尝试重新创建 JPG,生成的资产将略有不同,更大,and/or 具有新的 JPG 工件)。如果您只是预下载资产,只需使用一个简单的网络库,如 Alamofire 或 URLSession
.
我正在尝试使用 SDWebImage 从外部 url 和 return 下载图像。我不想在视图上设置它。这是我正在使用的代码,但它不起作用。我 return 没有。但我知道我传递的 url 有效,因为我可以在浏览器中看到它。我究竟做错了什么?
func downloadImage() -> CGImage {
var myImage: CGImage?
let myUrl = URL(string: "my-url-here.com")
SDWebImageDownloader.shared.downloadImage(with: myUrl, completed: { (image, data, error, true) in
print("Completed")
if image != nil {
myImage = image?.cgImage
}
})
return myImage!
}
我也试过这个版本,同样没有成功:
func downloadImage() -> CGImage {
var myImage: CGImage?
let myUrl = URL(string: "my-url-here.com")
SDWebImageManager.shared.loadImage(with: myUrl, options: .continueInBackground, progress: { (received, expected, nil) in
print(received, expected)
}, completed: { (downloadedImage, data, error, SDImageCacheType, true, imageUrlString) in
DispatchQueue.main.async {
if downloadedImage != nil {
myImage = downloadedImage?.cgImage
}
}
})
return myImage!
}
SDWebImage 是一个异步库。你不能只是 return
结果。通常,人们会使用 @escaping
闭包将结果提供给调用者。例如
func downloadImage(completion: @escaping(CGImage?) -> Void) {
let url = URL(string: "https://my-url-here.com")!
SDWebImageDownloader.shared.downloadImage(with: url) { image, _, _, _ in
completion(image?.cgImage)
}
}
你会像这样使用它:
downloadImage { image in
guard let image = image else { return }
// use image here
}
// but not here
但让我们退后一步,看看整个模式。你说你想“保存”结果。如果你正在谈论将它保存到持久存储,你根本不想使用 CGImage
(或 UIImage
或其他)。这在计算上效率低下(将资产转换为图像然后返回 Data
以便您可以保存它),space 效率低下(您必须同时将整个资产加载到内存中),并且可能会引入问题(例如,如果您下载 JPG,转换为 CGImage
,然后尝试重新创建 JPG,生成的资产将略有不同,更大,and/or 具有新的 JPG 工件)。如果您只是预下载资产,只需使用一个简单的网络库,如 Alamofire 或 URLSession
.