swift - UIImageView 有时不加载
问题描述
我有一个从使用此 UIImageView 扩展的 URL 加载用户图片的函数:
let imageCache = NSCache<AnyObject, AnyObject>()
extension UIImageView {
func loadImageUsingCacheWithUrlString(urlString: String) {
self.image = nil
print("here the URL of the image", urlString)
//check cache for image first
if let cachedImage = imageCache.object(forKey: urlString as AnyObject) {
self.image = cachedImage as? UIImage
return
}
// otherwise fire off a new download
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
if error != nil {
print(error!)
return
}
DispatchQueue.main.async {
if let downloadedImage = UIImage(data: data!) {
imageCache.setObject(downloadedImage, forKey: urlString as AnyObject)
self.image = downloadedImage
}
}
}).resume()
}
}
现在,我遇到的问题是,有时会加载个人资料图片,有时不会。我想这是因为函数异步下载图像,但为什么一旦下载它就不会出现在配置文件上?我打电话给它:
if hostPerfil != nil {
if let photo = hostPerfil?.picture {
hostPic.loadImageUsingCacheWithUrlString(urlString: photo)
}
hostName.text = hostPerfil!.firstName
}
我究竟做错了什么?有人可以帮我解决这个问题吗?
解决方案
当您从 imageCache 获取图像时,您需要在主 UI 线程中设置 UIImageView 的图像,以便正确呈现它。你在下载它时这样做了,这就是它显示的原因,但是当你从缓存中获取它时你也必须这样做。
DispatchQueue.main.async {
if let cachedImage = imageCache.object(forKey: urlString as AnyObject) {
self.image = cachedImage as? UIImage
return
}
}
推荐阅读
- php - 如何从父目录的子目录取消链接文件?PHP
- python - 我的 Python 代码中的某个地方有问题.. 我找不到它在哪里
- amazon-web-services - 在 AWS 上使用 Firebase Cloud Messaging (FCM) 发送通知时是否需要使用 Amazon SNS?
- android - 如何在开机时开启或启用 BT 和 Wifi?
- python-3.x - 在 Python3 中交错多个可变长度列表
- ios - iPhone BLE/GATT 接口
- java - 如何为相互 SSL 覆盖 Spring Boot 密钥库/信任库
- c++ - 使用 avro::memoryInputStream 创建 avro::DataFileReader
- swift - 将函数包装在闭包中以将其作为参数传递是否有任何开销
- javascript - 如何访问异步等待返回对象中的属性