簡體   English   中英

取消下載NSData contentsOfUrl

[英]Cancel a download of NSData contentsOfUrl

我有這個課下載圖像。 但是我有一個情況,我有多個使用此類的視圖將圖像下載到它們。 這些視圖是動態的,可能在下載完成之前隨時消失。

為避免錯誤,如果使用該視圖的視圖消失了,我將如何修改此類以取消下載?

class ImageDownloader{
    var spinner = UIActivityIndicatorView()

    func fetchImage(imageView: UIImageView, url:NSURL, completed: (success: Bool) ->()) {
        self.spinner.frame = CGRectMake((imageView.frame.width-35)/2, (imageView.frame.height-35)/2, 35, 35)
        imageView.addSubview(self.spinner)
        self.spinner.startAnimating()
        let qos = Int(QOS_CLASS_USER_INITIATED.rawValue)
        dispatch_async(dispatch_get_global_queue(qos, 0)) { () -> Void in
            let imageData = NSData(contentsOfURL: url) // this blocks the thread it is on
            dispatch_async(dispatch_get_main_queue()) {
                self.spinner.removeFromSuperview()
                if imageData != nil {
                    imageView.image = UIImage(data: imageData!)
                    completed(success: true)
                }else{
                    completed(success: false)
                }
            }
        }
    }
}

經過大量研究之后,看來NSURLSession確實是我想要實現的目標。 我很難找到與此有關的任何體面的教程或示例,這真是令人驚訝。 我最終從這里到那里的swift和Objective-c代碼片段進行編譯。

class imageDownloader:NSURLSession, NSURLSessionDelegate, NSURLSessionDownloadDelegate{
    var session:NSURLSession!
    var imageView:UIImageView!
    var task = NSURLSessionDownloadTask()
    var spinner = UIActivityIndicatorView()

    override init() {
        super.init()
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        self.session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    }

    func getImage(url:NSURL,imageView:UIImageView){
        self.imageView = imageView
        self.task = session.downloadTaskWithURL(url)
        self.spinner.frame = CGRectMake((imageView.frame.width-35)/2, (imageView.frame.height-35)/2, 35, 35)
        imageView.addSubview(self.spinner)
        self.spinner.startAnimating()
        self.task.resume()
    }


    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
        let data = NSData(contentsOfURL: location)
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            self.spinner.removeFromSuperview()
            self.imageView.image = UIImage(data: data! )
        }
    }

    func cancel(){
        self.task.cancel()
    }
}

如您所見,錯誤處理方式不多。 誰能建議如何改進它以包含此內容?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM