文档章节

iOS网络编程之二——NSURLSession的简单使用

珲少
 珲少
发布于 2016/02/22 17:06
字数 957
阅读 1278
收藏 13

iOS网络编程之二——NSURLSession的简单使用

一、NSURLSession简介

    在iOS7之后,NSURLSession作为系统推荐使用的HTTP请求框架,在进行前台请求的情况下,NSURLSession与NSURLConnection并无太大差异,对于后台的请求,NSURLSession更加灵活的优势就将展现无遗。

        1.NSURLSession集合的类型

        NSURLSession类提供3中Session类型:

        Default类型:提供前台请求相关方法,支持配置缓存,身份凭证等。

        Ephemeral类型:即时的请求类型,不使用缓存,身份凭证等。

        Background:后台类型,支持在后台完成请求任务。

        2.NSURLSession任务的类型

        在NSURLSession中添加的请求任务支持3中类型:

        数据任务:使用NSData对象进行数据的发送和获取,一般用于短数据的任务。

        下载任务:从文件下载数据,支持后台下载。

        上传任务:以文件的形式上传数据,支持后台上传。

二、创建并配置NSURLSession

        通过NSURLSessionConfiguration类对象对NSURLSession进行配置与创建,创建和配NSURLSession的示例代码如下:

    //默认类型的
    NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    //即时类型的
    NSURLSessionConfiguration * ephemeralConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    //后台类型的
    NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"SessionId"];
    
    //创建并设置session
    NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];
    NSURLSession * ephemeralSession = [NSURLSession sessionWithConfiguration:ephemeralConfiguration];
    NSURLSession * backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration];

NSURLSessionConfiguration还可以配置如缓存,网络模式等参数

三、使用NSURLSession进行网络请求的两种方式

        NSURLSession有两种方式进行网络数据的请求,一种是通过block的方式获取网络数据,一种是通过代理回调的方式获取网络数据。通过block的方式进行请求代码如下:

    //创建session配置对象
    NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    //创建请求对象
    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
    //创建session对象
    NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];
    //添加任务
    NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@",data);
    }];
    //开始任务
    [task resume];

使用代理回调的方式进行请求需要遵守如下协议:

@interface ViewController ()<NSURLSessionDataDelegate>
@end

将请求代码修改如下:

    NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
    NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request];
    [task resume];

实现代理方法如下:

//开始接受数据
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    NSLog(@"=======%@",data);
}
//接受数据结束
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    NSLog(@"完成:error%@",error);
}

四、进行后台下载任务

        NSURLSession最大的优势在于其后台下载的灵活性,使用如下的代码进行后台数据下载:

 NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.zyprosoft.backgroundsession"];
    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
    NSURLSession *  backgroundSession   = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:nil];
    [[backgroundSession downloadTaskWithRequest:request]resume];

在下面的回调方法中可以进行下载进度的监听:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    NSLog(@"######");
}

如果在下载过程中点击Home键使应用程序进入后台,NSURLSession的相关代理方法将不再被回调,但是下载任务依然在进行,当后台下载完成后会与AppDelegate进行交互,会调用AppDelegate中的如下方法:

-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{
    NSLog(@"1111");
}

之后应用程序在后台会调用NSURLSesstion代理的如下方法来通知下载结果:

//此方法无论成功失败都会调用
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    NSLog(@"完成:error%@",error);
}
//此方法只有下载成功才会调用 文件放在location位置
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    
}

最后将调用NSURLSesstion的如下方法:

-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
{
    
    NSLog(@"All tasks are finished");
    
}

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

 

 

 

© 著作权归作者所有

珲少

珲少

粉丝 873
博文 390
码字总数 469911
作品 0
上海
iOS工程师
私信 提问
iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song
2018/05/10
0
0
那些在学习iOS开发前就应该知道的事(part 2)

英文原文:Things I wish I had known before starting iOS development—Part 2 如果你还没读这篇文章的第一部分,请先读完了再来看第二部分。 那些在学习iOS开发前就应该知道的事(part 1)...

TomatosX
2015/06/12
0
0
iOS 仿看了吗应用、指南针测网速等常用工具、自定义弹出视图框架、图片裁剪、内容扩展等源码

iOS精选源码 扩展内容的cell - folding-cell(http://www.code4app.com/thread-12652-1-1.html) 一个近乎完整的可识别中国身份证信息的Demo 可自动快速...(http://www.code4app.com/thread-12...

Android爱开源
2018/10/31
0
0
iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song
2018/05/25
0
0
AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库

AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象。它的模块架构被良好的设计,拥有丰富的功能,...

lewis-180
2015/04/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写数据可视化大屏界面电子看板9-曲线效果

一、前言 为了编写数据可视化大屏界面电子看板系统,为了能够兼容Qt4和嵌入式linux系统,尤其是那种主频很低的,但是老板又需要在这种硬件上(比如树莓派、香橙派、全志H3、imx6)展示这么华...

飞扬青云
8分钟前
0
0
责任链模式

//这篇博客的博主真的不错,解析的都很清晰明了, https://blog.csdn.net/jason0539/article/details/45091639

南桥北木
34分钟前
2
0
Flutter -------- dio网络请求

dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等... 1.添加依赖# dependencies: dio: 2.1.x #...

切切歆语
44分钟前
1
0
PHP的学习

PHP变量的命名必须以$符开始,如: $i;$j;$name; $符后面的第一个字符不可以是数字,只能是字母或者下划线(_)。 除了下划线(_)之外,变量中不能出现任何特殊字符,也就是变量只能包含...

墨冥
今天
2
0
一篇文章彻底搞懂Java虚拟机

概念: 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Jav...

骚年锦时
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部