一、简单说明

  在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作。

  NSURLSession的使用非常简单,先根据会话对象创建一个请求Task,然后执行该Task即可。

 NSURLSessionTask本身是一个抽象类,在使用的时候,通常是根据具体的需求使用它的几个子类。关系如下:

  

二、发送GET请求

  使用NSURLSession发送GET请求的方法和NSURLConnection类似,整个过程如下:

    1)确定请求路径(一般由公司的后台开发人员以接口文档的方式提供),GET请求参数直接跟在URL后面

    2)创建请求对象(默认包含了请求头和请求方法【GET】),此步骤可以省略

    3)创建会话对象(NSURLSession)

    4)根据会话对象创建请求任务(NSURLSessionDataTask)

    5)执行Task

    6)当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)

示例代码:

发生GET请求第一种方法

func GET1()
{
//对请求路径的说明
//http://120.25.226.186:32812/login?username=520it&pwd=520&type=JSON
//协议头+主机地址+接口名称+?+参数1&参数2&参数3
//协议头(http://)+主机地址(120.25.226.186:32812)+接口名称(login)+?+参数1(username=520it)&参数2(pwd=520)&参数3(type=JSON)
//GET请求,直接把请求参数跟在URL的后面以?隔开,多个参数之间以&符号拼接      //1.确定请求路径
var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!
//2.创建请求对象
//请求对象内部默认已经包含了请求头和请求方法(GET)
var request: NSURLRequest = NSURLRequest(URL: url)
//3.获得会话对象
var session: NSURLSession = NSURLSession.sharedSession()
//4.根据会话对象创建一个Task(发送请求)
/*
第一个参数:请求对象
第二个参数:completionHandler回调(请求完成【成功|失败】的回调)
data:响应体信息(期望的数据)
response:响应头信息,主要是对服务器端的描述
error:错误信息,如果请求失败,则error有值
*/ var dataTask: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) in
if(error == nil)
       {
//6.解析服务器返回的数据
//说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)
var dict:NSDictionary? = nil
do {
dict = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.init(rawValue: )) as! NSDictionary
} catch {
}
print("%@",dict)
}
}
//5.执行任务
dataTask.resume()
}

发生GET请求第二种方法

func GET2()
{
//1.确定请求路径 var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")! //2.获得会话对象 var session: NSURLSession = NSURLSession.sharedSession() //3.根据会话对象创建一个Task(发送请求) /* 第一个参数:请求路径 第二个参数:completionHandler回调(请求完成【成功|失败】的回调) data:响应体信息(期望的数据) response:响应头信息,主要是对服务器端的描述 error:错误信息,如果请求失败,则error有值 注意: 1)该方法内部会自动将请求路径包装成一个请求对象,该请求对象默认包含了请求头信息和请求方法(GET) 2)如果要发送的是POST请求,则不能使用该方法 */ var dataTask: NSURLSessionDataTask = session.dataTaskWithURL(url) { (data, response, error) in //5.解析数据 var dict:NSDictionary? = nil do { dict = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.init(rawValue: )) as! NSDictionary } catch {
}
print("%@",dict)
}
//4.执行任务 dataTask.resume()
}

  

执行结果:

  此处打印的值是一个字典,字典中success这个key对应的value打印出来为Unicode编码的,如果想输出中文,可以为NSDictionary提供一个分类,重写系统中的方法。

  

//字典分类中重写系统的方法

    func descriptionWithLocale(locale: AnyObject,level: NSInteger) ->NSString

    {

        //初始化可变字符串

        var string: NSMutableString = NSMutableString()

        //拼接开头[

        string += "["

        [string appendString:@"["];

        //拼接字典中所有的键值对

        [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

                    [string appendFormat:@"%@:",key];

                    [string appendFormat:@"%@",obj];

                 }];

             //拼接结尾]

           [string appendString:@"]"];

           return string

    }

三、发送POST请求

  使用NSURLSession发送POST请求的方法和NSURLConnection类似,整个过程如下:

    1)确定请求路径(一般由公司的后台开发人员以接口文档的方式提供)

    2)创建可变的请求对象(因为需要修改),此步骤不可以省略

    3)修改请求方法为POST

    4)设置请求体,把参数转换为二进制数据并设置请求体

    5)创建会话对象(NSURLSession)

    6)根据会话对象创建请求任务(NSURLSessionDataTask)

    7)执行Task

    8)当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)

  示例代码:

 //发送POST请求NSURLSession

    func POST()
{
//对请求路径的说明 //http://120.25.226.186:32812/login //协议头+主机地址+接口名称 //协议头(http://)+主机地址(120.25.226.186:32812)+接口名称(login) //POST请求需要修改请求方法为POST,并把参数转换为二进制数据设置为请求体 //1.创建会话对象 var session: NSURLSession = NSURLSession.sharedSession() //2.根据会话对象创建task var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login")! //3.创建可变的请求对象 var request: NSMutableURLRequest = NSMutableURLRequest(URL: url) //4.修改请求方法为POST request.HTTPMethod = "POST" //5.设置请求体 request.HTTPBody ="username=520it&pwd=520it&type=JSON".dataUsingEncoding(NSUTF8StringEncoding) //6.根据会话对象创建一个Task(发送请求) /* 第一个参数:请求对象 第二个参数:completionHandler回调(请求完成【成功|失败】的回调) data:响应体信息(期望的数据) response:响应头信息,主要是对服务器端的描述 error:错误信息,如果请求失败,则error有值 */ var dataTask: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) in //if(error == nil){ //8.解析数据 //说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理) var dict:NSDictionary? = nil do { dict = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.init(rawValue: )) as! NSDictionary } catch { } print("%@",dict) //}
}
//5.执行任务
dataTask.resume()
}

四、NSURLSession代理方法简单介绍

有的时候,我们可能需要监听网络请求的过程(如下载文件需监听文件下载进度),那么就需要用到代理方法。接下来通过代码简单说明NSURLSession中普通网络请求会涉及代理方法的使用

private var _responseData: NSMutableData!

    var responseData: NSMutableData!{

        get{

            if _responseData == nil {

                _responseData = NSMutableData()

            }

            return _responseData

        }

        set{

            self._responseData = newValue

        }

    }

    //当点击控制器View的时候会调用该方法

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)

    {

        self.delegateTest()

    }

    //发送请求,代理方法

    func delegateTest()

    {

        //1.确定请求路径

        var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!

        //2.创建请求对象

        //请求对象内部默认已经包含了请求头和请求方法(GET)

        var request: NSURLRequest = NSURLRequest(URL: url)

        //3.获得会话对象,并设置代理

             /*

               第一个参数:会话对象的配置信息defaultSessionConfiguration 表示默认配置

               第二个参数:谁成为代理,此处为控制器本身即self

               第三个参数:队列,该队列决定代理方法在哪个线程中调用,可以传主队列|非主队列

               [NSOperationQueue mainQueue]   主队列:   代理方法在主线程中调用

               [[NSOperationQueue alloc]init] 非主队列: 代理方法在子线程中调用

             */

        var session: NSURLSession = NSURLSession(configuration:NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: self, delegateQueue: NSOperationQueue.mainQueue())

        //4.根据会话对象创建一个Task(发送请求)

        var dataTask: NSURLSessionTask = session.dataTaskWithRequest(request)

        //5.执行任务

        dataTask.resume()

    }

    //1.接收到服务器响应的时候调用该方法

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {

        //在该方法中可以得到响应头信息,即response

             print("didReceiveResponse--%@",NSThread.currentThread)

             //注意:需要使用completionHandler回调告诉系统应该如何处理服务器返回的数据

             //默认是取消的

             /*

                  NSURLSessionResponseCancel = 0,        默认的处理方式,取消

                  NSURLSessionResponseAllow = 1,         接收服务器返回的数据

                  NSURLSessionResponseBecomeDownload = 2,变成一个下载请求

                  NSURLSessionResponseBecomeStream        变成一个流

               */

        completionHandler(NSURLSessionResponseDisposition.Allow)

    }

    //2.接收到服务器返回数据的时候会调用该方法,如果数据较大那么该方法可能会调用多次

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {

        print("didReceiveData--%@",NSThread.currentThread)

        //拼接服务器返回的数据

        self.responseData.appendData(data)

    }

    //3.当请求完成(成功|失败)的时候会调用该方法,如果请求失败,则error有值

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {

        print("didCompleteWithError--%@",NSThread.currentThread)

        if (error == nil) {

            //解析数据,JSON解析请参考http://www.cnblogs.com/wendingding/p/3815303.html

            var dict:NSDictionary? = nil

            do {

                dict  = try NSJSONSerialization.JSONObjectWithData(self.responseData, options: NSJSONReadingOptions.init(rawValue: )) as! NSDictionary

            } catch {

            }

            print("%@",dict)
}
}

  代码执行结果:

  

[swift]NSURLSession的更多相关文章

  1. swift NSURLSession 使用方法

    //NSURLSession /*创建一个session ->创建一个task -> 启动task -> 处理回调 */ //http://www.douban.com/j/app/ ...

  2. Fiddler抓包一键生成代码

    首先我们的需求场景是 用Fiddler抓到某个接口调用后,用代码来模拟调用,一般我们写代码会有3个步骤: 1设置http请求相关的参数:header,method,url,cookie等 2设置pos ...

  3. swift 初探NSURLSession

    进行封装, 新建一个类.network class Network1: NSObject { // 没有参数+结果的get  自定义 HTTP method 和 URL+闭包 static func ...

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

    NSURLSession加载数据.下载.上传文件   NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍.   1,使用Data Task加载数据 使用全局的 ...

  5. iOS开发——网络编程Swift篇&(七)NSURLSession详解

    NSURLSession详解 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ func sessionLoadData() { //创建NSURL对象 var ...

  6. Swift - 使用NSURLSession同步获取数据(通过添加信号量)

    过去通过 NSURLConnection.sendSynchronousRequest() 方法能同步请求数据.从iOS9起,苹果建议废除 NSURLConnection,使用 NSURLSessio ...

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

    NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的sharedSession()和dataTaskWithR ...

  8. swift开发网络篇—利用NSURLSession 发送GET和POST请求

    说明:本文示例代码发送的请求均为http请求,需要对info.plist文件进行配置.如何配置,请参考https://github.com/HanGangAndHanMeimei/iOS9Adapta ...

  9. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

随机推荐

  1. 我的MYSQL学习心得(十一) 视图

    我的MYSQL学习心得(十一) 视图 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  2. mono for android中使用dapper或petapoco对sqlite进行数据操作

    在mono for android中使用dapper或petapoco,很简单,新建android 类库项目,直接把原来的文件复制过来,对Connection连接报错部分进行注释和修改就可以运行了.( ...

  3. 从零开始,DIY一个jQuery(3)

    在前两章,为了方便调试,我们写了一个非常简单的 jQuery.fn.init 方法: jQuery.fn.init = function (selector, context, root) { if ...

  4. WPF - 属性系统 (4 of 4)

    依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符. 但对于依赖项属性而言,属性执行逻辑 ...

  5. ztreeDeptSelect 基于jquery和ztree的部门选择插件

    插件介绍 首先我们来看插件的功能演示(效果): 插件准备好后.前台只需编写html: <input type="text" class="deptName" ...

  6. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  7. Webgl的2D开发方案(一)spritebatcher

    使用TypeScript 和 webgl 开发   第一步:实现了SpriteBatcher 例子如下 http://oak2x0a9v.bkt.clouddn.com/test/index.html ...

  8. 清除Android工程中没用到的资源

    项目需求一改再改,UI一调再调,结果就是项目中一堆已经用不到但却没有清理的垃圾资源,不说工程大小问题,对新进入项目的人或看其他模块的代码的人来说,这些没清理的资源可能也可能会带来困扰,所以最好还是清理 ...

  9. c#文件操作

    1.创建文件夹 //using System.IO; Directory.CreateDirectory(%%1);   2.创建文件 //using System.IO; File.Create(% ...

  10. 解析大型.NET ERP系统 权限模块设计与实现

    权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...