用Swift异步加载tableView图片

3

我的代码从网络上下载图片并将它们设置为tableView单元格的imageView。它可以正常工作,但是我需要点击单元格才能刷新单元格的内容并加载图片。我希望图片在加载完成后立即显示。我尝试在cellToUpdate下添加reloadData(),但是应用程序最终会陷入无限循环并崩溃。这是我的代码:

        let request: NSURLRequest = NSURLRequest(URL: imgURL)
        let getImage: NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
            if error == nil {
                                    image = UIImage(data: data)

                                    // Store the image in to our cache
                                    self.imageCache[urlString] = image
                                    dispatch_async(dispatch_get_main_queue(), {
                                        if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
                                            cellToUpdate.imageView?.image = image


                                        }
                                    })
                                }
                                else {
                                    println("Error: \(error.localizedDescription)")
                                }
                            })
        getImage.resume()

这段代码是否在didSelectRowAtIndexPath:中? - bjtitus
不太确定,我认为不是。 - user2747220
如果您想在单元格上轻点时刷新数据,则重新加载索引路径处的行。像这样:tbl_name?.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic),我认为您已经在didSelectRowAtIndexPath方法中编写了此代码。 - Bhoomi Jagani
1个回答

10

请使用以下类:

class ImageLoadingWithCache {

    var imageCache = [String:UIImage]()

    func getImage(url: String, imageView: UIImageView, defaultImage: String) {
        if let img = imageCache[url] {
            imageView.image = img
        } else {
            let request: NSURLRequest = NSURLRequest(URL: NSURL(string: url)!)
            let mainQueue = NSOperationQueue.mainQueue()

            NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler: { (response, data, error) -> Void in
                if error == nil {
                    let image = UIImage(data: data)
                    self.imageCache[url] = image

                    dispatch_async(dispatch_get_main_queue(), {
                        imageView.image = image
                    })
                }
                else {
                    imageView.image = UIImage(named: defaultImage)
                }
            })
        }
    }
}

使用方法:

var cache = ImageLoadingWithCache()
cache.getImage(YOUR_URL, imageView: YOUR_IMAGEVIEW, defaultImage: "DEFAULT_IMAGE_NAME")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接