Swift 加载到TableView的图像错误

Swift 加载到TableView的图像错误,swift,uitableview,nscache,Swift,Uitableview,Nscache,这是我第一次将NSCache用于表视图。对于cellForRow我调用NSCache加载图像。图像有时是错误的图像。我能做些什么来解决这个问题?如果缓存中不包含它,我会将照片替换为“randomguy” 考虑到以下情况: let cache=NSCache() 这是一种创建自定义图像视图的方法,其中包含一个函数,用于下载图像并将其分配给适当的单元格 let cache = NSCache<NSString, UIImage>() class CustomImageView: UII

这是我第一次将NSCache用于表视图。对于
cellForRow
我调用NSCache加载图像。图像有时是错误的图像。我能做些什么来解决这个问题?如果缓存中不包含它,我会将照片替换为“randomguy”

考虑到以下情况: let cache=NSCache()


这是一种创建自定义图像视图的方法,其中包含一个函数,用于下载图像并将其分配给适当的单元格

let cache = NSCache<NSString, UIImage>()

class CustomImageView: UIImageView {
    var imageURLString: String?

    func startImageDownloadOperation(url: URL) {
        imageURLString = url.absoluteString

        if let cachedVersion = cache.object(forKey: url.absoluteString as NSString) {
            self.image = cachedVersion
        } else {
            let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
                guard error == nil,
                    let response = response as? HTTPURLResponse,
                    response.statusCode == 200 else {
                        DispatchQueue.main.async {
                            self.image = UIImage(named: "default")
                        }
                        return
                }

                DispatchQueue.main.async {
                    if let data = data {
                        let imageToCache = UIImage(data: data)
                        if url.absoluteString == self.imageURLString {
                            self.image = imageToCache
                            cache.setObject(imageToCache!, forKey: url.absoluteString as NSString)
                        }
                    }
                }
            }

            task.resume()
        }
    }
}
let cache=NSCache()
类CustomImageView:UIImageView{
var imageURLString:String?
func startImageDownloadOperation(url:url){
imageURLString=url.absoluteString
如果让cachedVersion=cache.object(forKey:url.absoluteString作为NSString){
self.image=cachedVersion
}否则{
让task=URLSession.shared.dataTask(带:url){(数据、响应、错误)在
保护错误==零,
let response=响应为?HTTPURLResponse,
response.statusCode==200其他{
DispatchQueue.main.async{
self.image=UIImage(名为“默认”)
}
返回
}
DispatchQueue.main.async{
如果let data=data{
让imageToCache=UIImage(数据:数据)
如果url.absoluteString==self.imageURLString{
self.image=imageToCache
setObject(imageToCache!,forKey:url.absoluteString作为NSString)
}
}
}
}
task.resume()
}
}
}

为什么有这么多阵列?您只有一个数组,其中每个元素都是一个结构,包含用户名、消息等字段。您需要提供有关如何创建和填充缓存的更多详细信息。请使用数组的模型,在
if else
中执行相同的代码,并使用缓存更新它。SetObjective我认为问题在于我错误地附加了URLARY。
    func photoQuery () {
    for username in self.usernameArray {
        let photoQuery = PFQuery(className: "UserPhoto")
        photoQuery.whereKey("username", equalTo: username)
        photoQuery.findObjectsInBackground(block: { (objects: 
        [PFObject]?,error: Error?) in
        if let objects = objects {
            for object in objects {
                if error == nil {
                let userImageFile = object["photo"] as? PFFileObject
                let urlString = userImageFile?.url as! String

                    if let url = URL(string: urlString) {
                        let data = try? Data(contentsOf: url)
                        if let imageData = data {
            self.messageImageArray.append(UIImage(data:imageData)!)
            self.cache.setObject(UIImage(data:imageData)!, forKey: urlString as 
            NSString)
            self.urlArray.append(urlString as NSString)
            print(self.messageImageArray)
                        }
                    }
            }
        }

            }
        })
    }
}
let cache = NSCache<NSString, UIImage>()

class CustomImageView: UIImageView {
    var imageURLString: String?

    func startImageDownloadOperation(url: URL) {
        imageURLString = url.absoluteString

        if let cachedVersion = cache.object(forKey: url.absoluteString as NSString) {
            self.image = cachedVersion
        } else {
            let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
                guard error == nil,
                    let response = response as? HTTPURLResponse,
                    response.statusCode == 200 else {
                        DispatchQueue.main.async {
                            self.image = UIImage(named: "default")
                        }
                        return
                }

                DispatchQueue.main.async {
                    if let data = data {
                        let imageToCache = UIImage(data: data)
                        if url.absoluteString == self.imageURLString {
                            self.image = imageToCache
                            cache.setObject(imageToCache!, forKey: url.absoluteString as NSString)
                        }
                    }
                }
            }

            task.resume()
        }
    }
}