iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件

NSURLSession加载数据、下载、上传文件

NSURLSession类支持三种类型的任务:加载数据、下载和上传。下面通过样例分别进行介绍。

1,使用Data Task加载数据

使用全局的sharedSession()和dataTaskWithRequest方法创建。

 1 func sessionLoadData(){
 2     //创建NSURL对象
 3     let urlString:String="http://hangge.com"
 4     var url:NSURL! = NSURL(string:urlString)
 5     //创建请求对象
 6     var request:NSURLRequest = NSURLRequest(URL: url)
 7
 8     let session = NSURLSession.sharedSession()
 9
10     var dataTask = session.dataTaskWithRequest(request,
11         completionHandler: {(data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in
12             if error != nil{
13                 println(error?.code)
14                 println(error?.description)
15             }else{
16                 var str = NSString(data: data!, encoding: NSUTF8StringEncoding)
17                 println(str)
18             }
19     }) as NSURLSessionTask
20
21     //使用resume方法启动任务
22     dataTask.resume()
23 }

2,使用Download Task来下载文件

(1)不需要获取进度

使用sharedSession()和downloadTaskWithRequest方法即可

 1 func sessionSimpleDownload(){
 2     //下载地址
 3     var url = NSURL(string: "http://hangge.com/blog/images/logo.png")
 4     //请求
 5     var request:NSURLRequest = NSURLRequest(URL: url!)
 6
 7     let session = NSURLSession.sharedSession()
 8
 9     //下载任务
10     var downloadTask = session.downloadTaskWithRequest(request,
11         completionHandler: { (location:NSURL!, response:NSURLResponse!, error:NSError!) -> Void in
12             //输出下载文件原来的存放目录
13             println("location:\(location)")
14             //location位置转换
15             var locationPath = location.path
16             //拷贝到用户目录
17             let documnets:String = NSHomeDirectory() + "/Documents/1.png"
18             //创建文件管理器
19             var fileManager:NSFileManager = NSFileManager.defaultManager()
20             fileManager.moveItemAtPath(locationPath!, toPath: documnets, error: nil)
21             println("new location:\(documnets)")
22     })
23
24     //使用resume方法启动任务
25     downloadTask.resume()
26 }

(2)实时获取进度
需要使用自定义的NSURLSession对象和downloadTaskWithRequest方法

 1 import UIKit
 2
 3 class ViewController: UIViewController ,NSURLSessionDownloadDelegate {
 4
 5     override func viewDidLoad() {
 6         super.viewDidLoad()
 7
 8         sessionSeniorDownload()
 9     }
10
11     //下载文件
12     func sessionSeniorDownload(){
13         //下载地址
14         var url = NSURL(string: "http://hangge.com/blog/images/logo.png")
15         //请求
16         var request:NSURLRequest = NSURLRequest(URL: url!)
17
18         let session = currentSession() as NSURLSession
19
20         //下载任务
21         var downloadTask = session.downloadTaskWithRequest(request)
22
23         //使用resume方法启动任务
24         downloadTask.resume()
25     }
26
27     //创建一个下载模式
28     func currentSession() -> NSURLSession{
29         var predicate:dispatch_once_t = 0
30         var currentSession:NSURLSession? = nil
31
32         dispatch_once(&predicate, {
33             var config = NSURLSessionConfiguration.defaultSessionConfiguration()
34             currentSession = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)
35         })
36         return currentSession!
37     }
38
39     //下载代理方法,下载结束
40     func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask,
41         didFinishDownloadingToURL location: NSURL) {
42         //下载结束
43         println("下载结束")
44
45         //输出下载文件原来的存放目录
46         println("location:\(location)")
47         //location位置转换
48         var locationPath = location.path
49         //拷贝到用户目录
50         let documnets:String = NSHomeDirectory() + "/Documents/1.png"
51         //创建文件管理器
52         var fileManager:NSFileManager = NSFileManager.defaultManager()
53         fileManager.moveItemAtPath(locationPath!, toPath: documnets, error: nil)
54         println("new location:\(documnets)")
55     }
56
57     //下载代理方法,监听下载进度
58     func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask,
59         didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
60         //获取进度
61         var written:CGFloat = (CGFloat)(totalBytesWritten)
62         var total:CGFloat = (CGFloat)(totalBytesExpectedToWrite)
63         var pro:CGFloat = written/total
64         println("下载进度:\(pro)")
65     }
66
67     //下载代理方法,下载偏移
68     func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask,
69         didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {
70         //下载偏移,主要用于暂停续传
71     }
72
73     override func didReceiveMemoryWarning() {
74         super.didReceiveMemoryWarning()
75     }
76 }

3,使用Upload Task来上传文件

 1 func sessionUpload(){
 2     //上传地址
 3     var url = NSURL(string: "http://hangge.com/")
 4     //请求
 5     var request:NSURLRequest = NSURLRequest(URL: url!)
 6
 7     let session = NSURLSession.sharedSession()
 8
 9     //上传数据流
10     let documents =  NSHomeDirectory() + "/Documents/1.png"
11     var imgData = NSData(contentsOfFile: documents)
12
13     var uploadTask = session.uploadTaskWithRequest(request, fromData: imgData) {
14         (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in
15         //上传完毕后
16         println("上传完毕")
17     }
18
19     //使用resume方法启动任务
20     uploadTask.resume()
21 }
时间: 2024-10-25 09:19:00

iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件的相关文章

iOS开发——网络Swift篇&JSON与XML数据解析

JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit) 一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SDK自带的JSON解决方案NSJSONSerialization,这是一个非常好用的JSON生成和解析工具,效率也比其他第三方开源项目高. NSJSONSerialization能将JSON转换成Foundation对象,也能将Foundation对象转换成JSON,但转换成JSON的对象必须具有如下属性

Swift - 使用NSURLSession加载数据、下载、上传文件

NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的sharedSession()和dataTaskWithRequest方法创建. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 func sessionLoadData(){     //创建NSURL对象     let urlString:String="http://hangg

iOS开发——网络Swift篇&NSURL进行数据请求(POST与GET)

NSURL进行数据请求(POST与GET) 使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以分为同步请求和异步请求. 下面通过四个例子来进行演示. 1,使用POST方式提交数据(用户id和分数) (1)同步请求 1 //保存分数 2 func saveScore(score:Int, userid:String) 3 { 4 let urlString:String = "http://han

学习IOS开发网络多线程篇--NSThread/GCD/

NSThread:利用NSThread创建和启用一个线程 1. NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];,调用后调用[thread start]; 2. 创建线程后自动启动线程 ,[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 3. 隐式创建

iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)

Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都会这样写 Objective-C 1 //必须实现的数据源代理方法 2 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3 { 4 return self.dataArr

[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件

开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件.对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章. 在xalion窑主的指导下,我使用了indy自带的TIdMultiPartFormDataStre am类,来提交上传的文件. 如果使用indy的idhttp,则调用这个方法,即可以提交Form. function Post(AURL: string; ASource: TIdMultiPartFormDat

iOS开发>学无止境 - Cell异步图片加载优化,缓存机制详解

作者:勤奋的笨老头 网址:http://www.jianshu.com/p/02ab2b74c451 最近研究了一下UITbleView中异步加载网络图片的问题,iOS应用经常会看到这种界面.一个tableView上显示一些标题.详情等内容,在加上一张图片.这里说一下这种思路. 为了防止图片多次下载,我们需要对图片做缓存,缓存分为内存缓存于沙盒缓存,我们当然两种都要实现. 由于tableViewCell是有重用机制的,也就是说,内存中只有当前可见的cell数目的实例,滑动的时候,新显示cell会

iOS开发之控制器创建与加载(生命周期)

1.如何创建一个控制器 控制器常见的创建方式有以下几种: (1)通过storyboard创建 (2)直接创建 MJViewController *mj = [[MJViewController alloc] init]; (3)指定xib文件来创建 MJViewController *mj = [[MJViewController alloc] initWithNibName: @"MJViewController" bundle:nil]; 注意,创建xid后还要设置xid中哪个vi

Android网络项目课程笔记-----加载数据

加载更多数据 1. 分页 上拉加载更多 XListView 提示:数据方面,使用HTTP get或post请求,向服务端请求不同页面的内容 2. 瀑布流 二. 异步加载服务端数据