我在swift 3.0中的项目上工作,我使用NSCache缓存来自服务器的响应,将它们填充到UITableView中。然而,由于某种原因,我第一次看到应用程序加载时加载的图像很少,但如果如果我滚动并返回,我会看到所有内容(从服务器检索响应的结尾,我也重新加载了我的tableview,但看起来像不是这种情况)。我不知道我在这里完全错过了什么,代码如下,以显示我如何缓存图像。NSCache不适用于第一次加载时的所有图像
let imageCache = NSCache<AnyObject, AnyObject>()
var imageURLString : String?
extension UIImageView {
public func imageFromServerURL(urlString: String) {
imageURLString = urlString
if let url = URL(string: urlString) {
image = nil
if let imageFromCache = imageCache.object(forKey: urlString as AnyObject) as? UIImage {
self.image = imageFromCache
return
}
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
if error != nil{
print(error as Any)
return
}
DispatchQueue.main.async(execute: {
if let imgaeToCache = UIImage(data: data!){
if imageURLString == urlString {
self.image = imgaeToCache
}
imageCache.setObject(imgaeToCache, forKey: urlString as AnyObject)// calls when scrolling
}
})
}) .resume()
}
}
}
我的主要嫌疑人是imageURLString,因为它是全局变量,您将它与本地变量进行比较,但是您会为每个请求进行更改。 Y?确保这一点,为了什么你的目的,你写这个(如果imageURLString == urlString)是工作,因为你的期望和更多只是检查你的逻辑适用于只有一个图像? – Jageen
我认为这段代码是正确的,并且图像需要时间来加载,因为它们来自服务器,我认为如果你不滚动图像将仍然加载 – 3stud1ant3
否,如果我不滚动它不会炒锅:( – danu