//
// ViewController.m
// 02-NSURLSession
//
// Created by 鹿微微鹿 on 16/4/27.
// Copyright (c) 2016年 鹿微微鹿. All rights reserved.
//
//在这里总结一个方法,通过参数返回另一个页面一个消息或者其他东西
//可以把它写成一个block,然后另一个页面调用这个方法的时候直接给block参数赋值就行了!!
//block的参数
// NSURLSessionResponseCancel 告诉服务器取消数据传输
// NSURLSessionResponseAllow 告诉服务器允许传送传输
// completionHandler(NSURLSessionResponseAllow);
比如我们要在这个页面做网络请求数据,生成一个数组,我们需要将这个数据传回另一个页面然后显示出来,这个时候这个网络请求的方法可以加上一个block参数,demo如下
+(void)getComicDataWithStartId:(int)startId complete:(void(^)(NSArray *array))
//1.创建manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.创建请求
[manager GET:Comic_Get parameters:@{@"pageSize":@5, @"startIdx":[NSNumber numberWithInt:startId]} success:^(NSURLSessionDataTask *task, id responseObject) {
//3.拿到请求获取到得数据
NSMutableArray * dataArray = [[NSMutableArray alloc] init];
//遍历数据拿到字典
for (NSDictionary * dict in responseObject) {
//通过字典创建模型
YTModel * model = [[YTModel alloc] initWithDict:dict];
//将模型存到数组
[dataArray addObject:model];
}
//最后数据通过block返回到视图控制器中然后显示出来
complete(dataArray);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败");
complete(@[@"请求失败"]);
}];
}
//NSURLSession是http协议网络请求的一种方式
//功能比NSURLConnection强大;
//重要的类
//1.NSURL 请求地址
//2.NSURLRequest 请求对象
//3.NSURLSession 请求链接
//4.NSURLSessionConfiguration 会话模式
//会话模式分为三种:默认,瞬时,后台
//5.NSURLSessionTask
//任务分为三种:一般的数据任务,下载任务,上传任务
#import "ViewController.h"
#define path1 @"http://www.1000phone.net:8088/app/iAppFree/api/limited.php?page=1&number=4"
@interface ViewController ()<NSURLSessionDelegate,NSURLSessionDataDelegate,NSURLSessionTaskDelegate>{
//用来拼接从服务器返回的数据
NSMutableData *_mdata;
}
@implementation ViewController
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self test2];
}
#pragma mark - 通过协议方法获取服务器返回的数据
- (void)test2{
//1.创建会话模式
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
//2.通过会话模式创建session
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//3.创建url
NSURL *url = [NSURL URLWithString:path1];
//4.创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//5.通过session创建任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
//6.开始执行任务
[task resume];
}
#pragma mark - NSURLSession DataDelegate
//当接收到服务器响应的时候调用这个方法
//参数1:委托
//参数2:当前任务
//参数3:接收到得响应
//参数4:响应完成的block,必须在当前这个方法中调用,
//否则服务器不会返回数据;
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
NSLog(@"%@",response);
if (_mdata) {
_mdata.length = 0 ;
}else{
_mdata = [[NSMutableData alloc]init];
}
//block的参数
// NSURLSessionResponseCancel 告诉服务器取消数据传输
// NSURLSessionResponseAllow 告诉服务器允许传送传输
completionHandler(NSURLSessionResponseAllow);
}
//接收到服务器返回的数据的时候调用这个方法
//数据过大,这个方法可能会被调用多次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data{
//拼接每次接收到的数据
[_mdata appendData:data];
NSLog(@"接收到数据");
}
#pragma mark - NSURLSession TaskDelegate
//请求结束后会调用这个方法
//两种情况:正常结束(服务器数据返回完而结束)/异常结束(请求结束)
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error{
if (error) {
NSLog(@"请求失败");
}else {
//请求成功,解析数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_mdata options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
}
}
#pragma mark - 通过block获取服务器返回的数据
- (void)test1{
//1.创建会话模式
// defaultSessionConfiguration;默认模式,相当于使用[NSURLConnectioin send。。]发送请求,会缓存网络请求相关的一些数据
// ephemeralSessionConfiguration;瞬时模式,不会缓存网络请求相关的一些数据
//安全性要求比较高的网络请求
// backgroundSessionConfigurationWithIdentifier:后台模式,可以在后台处理一些
//网络请求;
NSURLSessionConfiguration *config = [NSURLSessionConfiguration
defaultSessionConfiguration ];
//2.通过会话模式创建一个session
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
//3.创建URL对象
NSURL *url = [NSURL URLWithString:path1];
//4.创建一个请求对象
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:url];
//5.创建一个任务,根据不同的功能创建不同的任务
//比如下载或者上传和一般数据
//NSURLSessionTask是一个专门用来继承的类,使用的是它的子类
// NSURLSessionDataTask 数据任务(json和xml数据请求)
//NSURLSessionDownloadTask 下载任务 (下载文件的网络请求)
//NSURLSessionUploadTask 上传任务 (上传文件的网络请求)
//参数1:要发送的请求;
//参数2:接收服务器返回的数据的block
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//参数1:服务器返回的数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
//参数2:服务器的响应
NSLog(@"%@",response);
//参数3:错误信息
NSLog(@"%@",error);
}];
//6.执行任务
[task resume];
}
- (void)viewDidLoad {
[super viewDidLoad];
}
@end