网络请求(NSURLSession)



IOS7之后请求变化


  • NSURLSession:
  1. 在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSession作为替代.
  2. 支持后台运行的网络任务
  3. 暂停,停止,重启网路任务,不在需要NSPpation封装
  4. 请求可以使用同样的配置容器
  5. 不同的session可以使用不同的私有存储,block和代理可以同时起作用
  6. 直接从文件系统上传,下载
  7. 为了方便程序员使用,苹果提供了一个全局 session
  8. 所有的任务(Task)都是由Session发起的
  9. 所有的任务默认都是挂起的,需要Resume

  • 工作模式:
  1. 默认会话模式 (default)
  2. 瞬时会话模式 (ephemeral)
  3. 后台会话模式 (background)

  • 支持的任务类型
  1. 加载数据
  2. 下载
  3. 上传






#import "ViewController.h"

@interface ViewController ()<</span>NSURLSessionDataDelegate>
//
@property (nonatomic,strong) NSMutableData *resultData;
@end

@implementation ViewController

- (
void)viewDidLoad {
    [
super viewDidLoad];
   
// Do any additional setup after loading the view, typically from a nib.
}

#pragma mark ----block -------------


- ( IBAction )get:( id )sender {

     // 使用系统提供的全局的 NSURLSession 对象 , 是一个单例
    NSURLSession *session = [ NSURLSession sharedSession ];

    // 创建 url(用于初始化task)
    NSURL *url = [ NSURL URLWithString :urlString];

     //用URL初始化task 在block内部可以直接对返回的数据进行处理
    //NSURLSession 是基于任务的 , 所以所有的东西都哟啊放到任务里面 ,NSURLSessionTask 就是 NSURLSession 的任务执行对象
   
NSURLSessionTask *task = [session dataTaskWithURL :url completionHandler :^( NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil ) {
       //解析数据
        NSDictionary *dic = [ NSJSONSerialization JSONObjectWithData :data options :( NSJSONReadingAllowFragments ) error : nil ];
            NSLog ( @"Session GET 异步 --> %@" ,dic);
        }
    }];
   
//NSURLSession 的所以任务默认是挂起的 , 所以一定要调用 resume 方法 , 让任务开始
    [task resume ];   
}
- ( IBAction )post:( id )sender {
    // 使用系统提供的全局的 NSURLSession 对象 , 是一个单例
   
NSURLSession *session = [ NSURLSession sharedSession ];
   
    // 创建 url(用于创建请求)
    NSURL *url = [NSURL URLWithString:urlString];

    // 创建请求(用于初始化task)
    NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL :url];
   
// 设置 POST 方式和 body
   
NSString *dataString = @"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" ;
   
NSData *postData = [dataString dataUsingEncoding : NSUTF8StringEncoding ];
    [request
setHTTPMethod : @"POST" ];
    [request setHTTPBody:postData];
    
     //初始化task  在block内部可以直接对返回的数据进行处理
    NSURLSessionTask *task = [session dataTaskWithRequest :request completionHandler :^( NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {   
        NSDictionary *dict = [ NSJSONSerialization JSONObjectWithData :data options :( NSJSONReadingAllowFragments ) error : nil ];
            NSLog ( @"Session POST 异步 ---> %@" ,dict);
        }
    }];
   
// 让任务开始
    [task resume];
}

#pragma mark -----代理-------------


首先:遵循 <</span>NSURLSessionDataDelegate>协议,并且创建属性Data用来接收下载下来的数据

//get
- ( IBAction )get:( id )sender {
    //NSURLSession 代理的异步操作
   
//NSURLSession 代理人的属性是只读的
   // 参数 1: 工作模式 ( 此处是会话模式 )
    // 参数 2: 代理人
   
// 参数 3: 代理方法在哪个线程中进行
   
NSURLSession *session = [ NSURLSession sessionWithConfiguration :[ NSURLSessionConfiguration defaultSessionConfiguration ] delegate : self delegateQueue :[ NSOperationQueue mainQueue ]];
   
// 创建 url
   
NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" ;
   
NSURL *url = [ NSURL URLWithString :urlString];
   
    //通过url创建dataTask
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL :url];
     //启动任务
    [dataTask resume ];

}

//post
- ( IBAction )post:( id )sender {
    //
    NSURLSession *session = [ NSURLSession sessionWithConfiguration :[ NSURLSessionConfiguration defaultSessionConfiguration ] delegate : self delegateQueue :[ NSOperationQueue mainQueue ]];

    // 创建 url
    //创建MutableRequest
    NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL :url];
   
NSString *dataString = @"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" ;
   
NSData *postData = [dataString dataUsingEncoding : NSUTF8StringEncoding ];
    [request
setHTTPMethod : @"POST" ];
    [request setHTTPBody:postData];
     //创建dataTask
    NSURLSessionDataTask *task = [session dataTaskWithRequest :request];
     //启动任务
    [task resume];   
}

#pragma mark  -----NSURLSessionDataDelegate协议方法

//服务器开始响应,准备返回数据
- ( void )URLSession:( NSURLSession *)session dataTask:( NSURLSessionDataTask *)dataTask
didReceiveResponse:( NSURLResponse *)response
 completionHandler:(void (^)( NSURLSessionResponseDisposition disposition))completionHandler{
     //*允许吹服务器的响应,才会继续接收服务器返回的数据
    completionHandler( NSURLSessionResponseAllow );
   
self . resultData = [ NSMutableData data ];
}
/ /客户端接收到数据
- ( void )URLSession:( NSURLSession *)session dataTask:( NSURLSessionDataTask *)dataTask
didReceiveData:(
NSData *)data{
    [
self . resultData appendData :data];
}
//数据接收完成, 结束响应
- ( void )URLSession:( NSURLSession *)session task:( NSURLSessionTask *)task didCompleteWithError:( NSError *)error {
   
if (error == nil ) {
       
NSDictionary *dict = [ NSJSONSerialization JSONObjectWithData : self . resultData options :( NSJSONReadingAllowFragments ) error : nil ];
       
NSLog ( @"Dictionary = %@" , dict);
    }
}

@end


总结






Session n. 会议;(法庭的)开庭;
task n. 工作,作业;任务
completion n. 完成,结束;实现
Handler n. 处理者;管理者
Configuration n. 配置;结构;外形
default n. 违约;缺席;缺乏;系统默认值
resume vt. 重新开始,继续;恢复,重新占用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值