Swift异步加载映像 [英] Swift async load image
问题描述
我正在处理来自url异步的显示图像.我试图创建一个用于下载图像的新线程,然后在main thread
上刷新.
I am working on show image from url async. I have tried to create a new thread for download image and then refresh on main thread
.
func asyncLoadImg(product:Product,imageView:UIImageView){
let downloadQueue = dispatch_queue_create("com.myApp.processdownload", nil)
dispatch_async(downloadQueue){
let data = NSData(contentsOfURL: NSURL(string: product.productImage)!)
var image:UIImage?
if data != nil{
image = UIImage(data: data!)
}
dispatch_async(dispatch_get_main_queue()){
imageView.image = image
}
}
}
当我尝试调试时,涉及dispatch_async(downloadQueue)时,它会跳出功能.有什么建议吗?谢谢
When I was trying to debug that, when it comes to dispatch_async(downloadQueue), it jumps out the func. Any suggestion? Thx
推荐答案
Swift 5.0+更新的代码:(获得了 jamesrochabrun 的帮助链接
Swift 5.0+ updated Code :( took help from jamesrochabrun Link https://github.com/jamesrochabrun/JSONTutorialFinal )
extension UIImageView {
let imageCache = NSCache<NSString, UIImage>()
func imageFromServerURL(_ URLString: String, placeHolder: UIImage?) {
self.image = nil
//If imageurl's imagename has space then this line going to work for this
let imageServerUrl = URLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
if let cachedImage = imageCache.object(forKey: NSString(string: imageServerUrl)) {
self.image = cachedImage
return
}
if let url = URL(string: imageServerUrl) {
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
//print("RESPONSE FROM API: \(response)")
if error != nil {
print("ERROR LOADING IMAGES FROM URL: \(error)")
DispatchQueue.main.async {
self.image = placeHolder
}
return
}
DispatchQueue.main.async {
if let data = data {
if let downloadedImage = UIImage(data: data) {
imageCache.setObject(downloadedImage, forKey: NSString(string: imageServerUrl))
self.image = downloadedImage
}
}
}
}).resume()
}
}
}
快速3更新代码:
extension UIImageView {
public func imageFromServerURL(urlString: String) {
self.image = nil
URLSession.shared.dataTask(with: NSURL(string: urlString)! as URL, completionHandler: { (data, response, error) -> Void in
if error != nil {
print(error)
return
}
DispatchQueue.main.async(execute: { () -> Void in
let image = UIImage(data: data!)
self.image = image
})
}).resume()
}}
Swift 2.2代码:
extension UIImageView {
public func imageFromServerURL(urlString: String) {
self.image = nil
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: { (data, response, error) -> Void in
if error != nil {
print(error)
return
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let image = UIImage(data: data!)
self.image = image
})
}).resume()
}}
现在,无论您需要什么地方,都只需执行此操作即可从服务器url加载图像:
Now wherever you required just do this to load image from server url :
-
使用占位符图像的swift 3.0 +更新代码: UIImageView.imageFromServerURL(URLString:此处服务器url",placeHolder:uiimage格式的占位符图像)
Using swift 3.0 + updated code using placeholder image : UIImageView.imageFromServerURL(URLString:"here server url",placeHolder: placeholder image in uiimage format)
Swfit 3以下: UIImageView.imageFromServerURL(此处服务器网址")
Swfit 3 or less : UIImageView.imageFromServerURL("here server url")
简单!
这篇关于Swift异步加载映像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!