我从url获取图像并在tableview中显示它成功发生但是当我自动滚动并反复更改但是在我暂停了几秒钟后(大约10次或更长时间)正确的图像加载。
func load_image(urlString:String)
{
let imgURL: NSURL = NSURL(string: urlString)!
let request: NSURLRequest = NSURLRequest(URL: imgURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
if (error == nil && data != nil)
{
func display_image()
{
cell.pic.image = UIImage(data: data!)
}
dispatch_async(dispatch_get_main_queue(), display_image)
}
}
task.resume()
}
load_image(urls[indexPath.row])
答案 0 :(得分:0)
首先,为什么要加载图片,我猜是cellForRowAtIndexPath
?
您可以在viewDidLoad
中加载它并存储在某个数组中。但是,如果你需要这样做,就像你正在做的那样......
为了获得更好的性能您可以使用NSCache
来防止每次tableview显示您的单元格时加载图像。尝试类似的东西:
let imageCache = NSCache()
func load_image(urlString:String)
{
if let imageFromCache = imageCache.objectForKey(urlString) as? UIImage {
cell.pic.image = imageFromCache
return
}
let imgURL: NSURL = NSURL(string: urlString)!
let request: NSURLRequest = NSURLRequest(URL: imgURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
if (error == nil && data != nil)
{
func display_image()
{
let imageToCache = UIImage(data: data!)
cell.pic.image = UIImage(data: data!)
imageCache.setObject(imageToCache!, forKey: urlString)
}
dispatch_async(dispatch_get_main_queue(), display_image)
}
}
task.resume()
}
有关NSCache的更多信息,您可以查看documentation。
答案 1 :(得分:0)
滚动时正在重复使用您的单元格。滚动时将调用cellForRowAt
方法。
在imageView.image = nil
方法中设置cellForRowAt
,这样在下载图像视图之前不会显示任何图像。
我们认为imageView.image = nil
是因为如果没有可用于该单元格的图像,则不应该为该单元格显示图像。