使用NSURLSessionDownloadTask进行断点下载

效果图

downloadImage

下面是完整的下载代码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
////  NSURLSessionDownloadViewController.swift//  NSURLSessionDemo////  Created by Benjamin on 11/21/15.//  Copyright  2015 Benjamin. All rights reserved.//

import UIKit

class NSURLSessionDownloadViewController: UIViewController,NSURLSessionDownloadDelegate {    @IBOutlet weak var progressBar: UIProgressView!    @IBOutlet weak var image: UIImageView!    let imageStringURL = "http://carolinehjq.com/images/avatar.jpg"    var task: NSURLSessionDownloadTask? = nil    var partialData: NSData? = nil    let fileManager = NSFileManager.defaultManager()    var session: NSURLSession!    var request: NSURLRequest!

override func viewDidLoad() {        super.viewDidLoad()        self.session = getSession()        self.request = getRequest(imageStringURL)        self.progressBar.progress = 0    }

required init?(coder aDecoder: NSCoder) {        super.init(coder: aDecoder)    }

//取得单个session    func getSession() -> NSURLSession {        let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: self, delegateQueue: nil)        return session    }

/**     return a request by url of image

- parameter imageStringURL: imageStringURL

- returns: NSURLRequest     */    func getRequest(imageStringURL: String) -> NSURLRequest {        let url = NSURL(string: imageStringURL)        return NSURLRequest(URL: url!)    }

// Start Action    @IBAction func start(sender: UIButton) {        self.task = self.session.downloadTaskWithRequest(self.request)        self.task?.resume()    }

// Pause Action    @IBAction func pause(sender: UIButton) {        print("pause download task")        if self.task != nil {            //取消下载任务,把下载好的数据存起来            self.task?.cancelByProducingResumeData({ (resumeData: NSData?) -> Void in                self.partialData = resumeData                self.task = nil            })        }    }

// Resume Action    @IBAction func resume(sender: UIButton) {        print("resume download task")        if self.task == nil {            if self.partialData != nil {                self.task = self.session.downloadTaskWithResumeData(self.partialData!)            } else {                self.task = self.session.downloadTaskWithRequest(self.request)            }        }        self.task?.resume()    }

/**     创建文件本地保存目录

- parameter location: download location url

- returns: NSURL     */    func createDirectoryForDownloadItemFromURL(location: NSURL!) -> NSURL{        let documentURL: NSURL = (fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask))[0]        return documentURL.URLByAppendingPathComponent(location.lastPathComponent!)    }

/**     把文件拷贝到指定路径

- parameter location:    original location     - parameter destination: destinate location

- returns: success is true, else false     */    func copyTempFileAtURL(fromLocation location: NSURL, toDestination destination: NSURL) -> Bool {        do {            try fileManager.copyItemAtURL(location, toURL: destination)        } catch {            print("file copy error")            return false        }        return true    }

//MARK:下载完成调用    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {        //下载完成后,文件是放在一个临时目录,需要开发者自己拷到防止该文件的目录        let destination = createDirectoryForDownloadItemFromURL(location)        print("download success for url: \(destination)")        //如果文件copy成功        if copyTempFileAtURL(fromLocation: location, toDestination: destination) {            dispatch_async(dispatch_get_main_queue(), { () -> Void in                let image1 = UIImage(contentsOfFile: destination.path!)                self.image.image = image1                self.image.contentMode = .ScaleAspectFill                self.image.hidden = false            })        } else {            print("copy file error")        }        self.task = nil    }

//MARK:下载中调用    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {        let currentProgress = Double(totalBytesWritten) / Double(totalBytesExpectedToWrite)        print("下载了\(currentProgress)")        dispatch_async(dispatch_get_main_queue()) { () -> Void in            self.progressBar.progress = Float(currentProgress)            self.progressBar.hidden = false        }    }

//MARK:继续下载调用    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {        print("resume...")    }

}

今天学到了Alamofire才有了更简单地方法:

1234567891011121314151617
Alamofire.download(.GET, "https://httpbin.org/stream/100", destination: destination)         .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in             print(totalBytesRead)

// This closure is NOT called on the main queue for performance             // reasons. To update your ui, dispatch to the main queue.             dispatch_async(dispatch_get_main_queue()) {                 print("Total bytes read on main queue: \(totalBytesRead)")             }         }         .response { _, _, _, error in             if let error = error {                 print("Failed with error: \(error)")             } else {                 print("Downloaded file successfully")             }         }
时间: 2024-12-03 20:43:31

使用NSURLSessionDownloadTask进行断点下载的相关文章

Android实现多线程断点下载的方法

  本文实例讲述了Android实现多线程断点下载的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

多线程-android 多个文件,每个文件都使用断点下载,线程是否会太多

问题描述 android 多个文件,每个文件都使用断点下载,线程是否会太多 我现在想使用文件的断点下载功能,每个文件可以分成几断,使用线程下载,如果存在多个文件都是用线程下载的话,线程有点多,怎样才是一个合适的方法 解决方案 可以试试线程池,或者做一个自己控制的线程队列 解决方案二: 线程池,或者就用AsyncTask,里面用的就是线程池.

ttp onnection- 多线程断点下载报异常Unexpected and of file from

问题描述 多线程断点下载报异常Unexpected and of file from 这个是我的读取文件的代码 URL url=new URL(webAddr); //根据网络资源创建URL对象 httpConnection=(HttpURLConnection)url.openConnection(); //创建 打开的连接对象 httpConnection.setRequestProperty("User-Agent", "NetFox"); String sp

使用NSURLConnection实现大文件断点下载

使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下载,需要满足1个条件,那就是,必须要服务器支持断点下载.   实现的思路是这样子的: 1.  第一次会获取到被下载文件的总大小(服务器提供这个值) 下载文件总大小 = 期望从服务器获取文件的大小 + 本地已经下载的文件的大小 2.  设置请求的缓存策略为不会读取本地中已经缓存的数据(NSURLReq

如何通过云存储实现大文件的断点下载和上传

背景 对象存储 OSS是面向海量非结构化数据对象的存储服务.随着云计算的普及和飞速增长,越来越多的开发者把他们的应用建筑在了 OSS之上.OSS对外提供的是RESTful形式的接口,其最重要的特点之一是无状态性(statelessness),即OSS服务器不会保持除了单次请求之外的,任何与其通信的客户端的通信状态.因此对于断点续传这样有状态功能的实现,关键点在于如何在客户端完成状态维护 . 本文将以Python为例,介绍通过OSS是实现大文件的断点下载和断点上传的. 具体操作步骤 (一)在OSS

java-多线程加上断点下载多个文件文件出现问题了

问题描述 多线程加上断点下载多个文件文件出现问题了 package cn.com.sinosoft.sfjy.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import jav

Handle和多线程断点下载

一般来讲服务器只允许同一IP同时开着3到5条线程去下载一个资源.所以客户开着许多线程去下载不一定就很快! 注意: (1)为进度条设置样式:style="?android:attr/progressBarStyleHorizontal"其中?表示引用 <ProgressBar style="?android:attr/progressBarStyleHorizontal"     android:layout_width="fill_parent&qu

iOS开发网络篇—大文件的多线程断点下载

iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: 1 #import "YYViewControl

我的Android进阶之旅------&amp;gt;Android基于HTTP协议的多线程断点下载器的实现

一.首先写这篇文章之前,要了解实现该Android多线程断点下载器的几个知识点  1.多线程下载的原理,如下图所示 注意:由于Android移动设备和PC机的处理器还是不能相比,所以开辟的子线程建议不要多于5条.当然现在某些高端机子的处理器能力比较强了,就可以多开辟几条子线程. 2.为了实现断点下载,采用数据库方式记录下载的进度,这样当你将该应用退出后,下次点击下载的时候,程序会去查看该下载链接是否存在下载记录,如果存在下载记录就会判断下载的进度,如何从上次下载的进度继续开始下载. 3.特别注意