NSURLSession加载数据、下载、上传文件
NSURLSession类支持三种类型的任务:加载数据、下载和上传。下面通过样例分别进行介绍。
1,使用Data Task加载数据
使用全局的sharedSession()和dataTaskWithRequest方法创建。
func sessionLoadData(){ //创建NSURL对象 let urlString:String="http://hangge.com" var url:NSURL! = NSURL(string:urlString) //创建请求对象 var request:NSURLRequest = NSURLRequest(URL: url) let session = NSURLSession.sharedSession() var dataTask = session.dataTaskWithRequest(request, completionHandler: {(data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in if error != nil{ println(error?.code) println(error?.description) }else{ var str = NSString(data: data!, encoding: NSUTF8StringEncoding) println(str) } }) as NSURLSessionTask //使用resume方法启动任务 dataTask.resume() }
2,使用Download Task来下载文件
(1)不需要获取进度
使用sharedSession()和downloadTaskWithRequest方法即可
func sessionSimpleDownload(){ //下载地址 var url = NSURL(string: "http://hangge.com/blog/images/logo.png") //请求 var request:NSURLRequest = NSURLRequest(URL: url!) let session = NSURLSession.sharedSession() //下载任务 var downloadTask = session.downloadTaskWithRequest(request, completionHandler: { (location:NSURL!, response:NSURLResponse!, error:NSError!) -> Void in //输出下载文件原来的存放目录 println("location:\(location)") //location位置转换 var locationPath = location.path //拷贝到用户目录 let documnets:String = NSHomeDirectory() + "/Documents/1.png" //创建文件管理器 var fileManager:NSFileManager = NSFileManager.defaultManager() fileManager.moveItemAtPath(locationPath!, toPath: documnets, error: nil) println("new location:\(documnets)") }) //使用resume方法启动任务 downloadTask.resume() }
(2)实时获取进度
需要使用自定义的NSURLSession对象和downloadTaskWithRequest方法
import UIKit class ViewController: UIViewController ,NSURLSessionDownloadDelegate { override func viewDidLoad() { super.viewDidLoad() sessionSeniorDownload() } //下载文件 func sessionSeniorDownload(){ //下载地址 var url = NSURL(string: "http://hangge.com/blog/images/logo.png") //请求 var request:NSURLRequest = NSURLRequest(URL: url!) let session = currentSession() as NSURLSession //下载任务 var downloadTask = session.downloadTaskWithRequest(request) //使用resume方法启动任务 downloadTask.resume() } //创建一个下载模式 func currentSession() -> NSURLSession{ var predicate:dispatch_once_t = var currentSession:NSURLSession? = nil dispatch_once(&predicate, { var config = NSURLSessionConfiguration.defaultSessionConfiguration() currentSession = NSURLSession(configuration: config, delegate: self, delegateQueue: nil) }) return currentSession! } //下载代理方法,下载结束 func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { //下载结束 println("下载结束") //输出下载文件原来的存放目录 println("location:\(location)") //location位置转换 var locationPath = location.path //拷贝到用户目录 let documnets:String = NSHomeDirectory() + "/Documents/1.png" //创建文件管理器 var fileManager:NSFileManager = NSFileManager.defaultManager() fileManager.moveItemAtPath(locationPath!, toPath: documnets, error: nil) println("new location:\(documnets)") } //下载代理方法,监听下载进度 func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { //获取进度 var written:CGFloat = (CGFloat)(totalBytesWritten) var total:CGFloat = (CGFloat)(totalBytesExpectedToWrite) var pro:CGFloat = written/total println("下载进度:\(pro)") } //下载代理方法,下载偏移 func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) { //下载偏移,主要用于暂停续传 } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
3,使用Upload Task来上传文件
func sessionUpload(){ //上传地址 var url = NSURL(string: "http://hangge.com/") //请求 var request:NSURLRequest = NSURLRequest(URL: url!) let session = NSURLSession.sharedSession() //上传数据流 let documents = NSHomeDirectory() + "/Documents/1.png" var imgData = NSData(contentsOfFile: documents) var uploadTask = session.uploadTaskWithRequest(request, fromData: imgData) { (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in //上传完毕后 println("上传完毕") } //使用resume方法启动任务 uploadTask.resume() }