使用UIProgressView指示器在UITableView中下载图像

时间:2015-02-03 13:32:41

标签: ios objective-c uitableview swift asynchronous

我想在异步下载图片时显示进度指示器。

我用单张图片完成了。

但是,我将如何在tableView中实现这一目标?。因为我正在使用 NSURLSessionDownloadDelegate 并在 URLSession 委托方法中取得进展。

但是,如何在tableView中执行此操作,其中将重用单元格,不同的单元格具有不同的图像,所有这些图像将具有不同的进度值...?

这是我的代码。

class ViewController: UIViewController,NSURLConnectionDataDelegate,NSURLSessionDownloadDelegate {

var session:NSURLSession?
var downloadTask:NSURLSessionDownloadTask?
var downloadURLString = "imageURL"


override func viewDidLoad() {
    super.viewDidLoad()


    var configuration:NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.app.POCWhatsappLoadingIndicator")

    configuration.allowsCellularAccess = true

    session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

    var downloadURL:NSURL = NSURL(string: downloadURLString)!

    var request:NSURLRequest = NSURLRequest(URL: downloadURL)

    downloadTask = self.session?.downloadTaskWithRequest(request)

    downloadTask?.resume()

}

委派方法

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL){

    var fileManager:NSFileManager = NSFileManager.defaultManager()
    var URLs:NSArray = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
    var documentsDirectory:NSURL = URLs.objectAtIndex(0) as NSURL
    var fromURL:NSURL = downloadTask.originalRequest.URL
    var destinationURL:NSURL = documentsDirectory.URLByAppendingPathComponent(fromURL.lastPathComponent!)
    var error:NSError?


    fileManager.removeItemAtURL(destinationURL, error: nil)

    var success:Bool = fileManager.copyItemAtURL(location, toURL: destinationURL, error: &error)

    if(success){


        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {

            var image:UIImage = UIImage(contentsOfFile: destinationURL.path!)!
            UIGraphicsBeginImageContext(CGSizeMake(1, 1))
            var context:CGContextRef = UIGraphicsGetCurrentContext()
            CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), image.CGImage)
            UIGraphicsEndImageContext()

            dispatch_sync(dispatch_get_main_queue(), {

            self.IBDownloadedImage.image = image

            })  
        })  
    }else{
          println("File Copy failed: \(error)")
    }
}


func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64){

    var progress:Float = ((Float(totalBytesWritten)/Float(totalBytesExpectedToWrite)))

    dispatch_async(dispatch_get_main_queue(), {

        self.updateProgress(progress)

    })

}

自定义方法

func updateProgress(progress:Float){

    if(progress < 1.0){

        self.IBProgressView.setProgress(progress, animated: true)
        }
    }

适用于单张图像。 但是如何处理 UITableView。

感谢。

2 个答案:

答案 0 :(得分:1)

最好使用带有ActivityIndi​​cator的 SDWebImage 库。您还可以获取活动指示器和图像缓存。

link:sdwebimage github

答案 1 :(得分:0)

您需要在UITableViewCell中拥有进度指示器对象。

检查以下答案。 Custom UITableViewCell with Progress Bar download update