构建URL
NSURL *url = [NSURL URLWithString:@"http://218.76.27.57:8080/chinaschool_rs02/135275/153903/160861/160867/1370744550357.mp3"];
构建NSURLSeesionConfiguration
/*
defaultSessionConfiguration; 默认会话类型,能够进行磁盘缓存
ephemeralSessionConfiguration; 临时会话类型,不进行任何的磁盘缓存
backgroundSessionConfigurationWithIdentifier:(NSString *)identifier 后台类型,用于后台下载上传
*/
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
//设置配置文件
//设置缓存策略
//config.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
//设置网络服务类型 决定了网络请求的形式
config.networkServiceType = NSURLNetworkServiceTypeDefault;
//设置请求超时时间
config.timeoutIntervalForRequest = 15;
//设置请求头
//config.HTTPAdditionalHeaders
//网络属性 是否使用移动流量
config.allowsCellularAccess = YES;
创建会话对象
//delegateQueue 网络请求都是在后台进行,但是当网络请求完成后,可能会需要回到主线程进行刷新界面操作。所以此时可以设置代理回调方法所执行的队列。
//NSURLSessionDataDelegate -> NSURLSessionTaskDelegate -> NSURLSessionDelegate
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
创建网络任务
NSURLSessionDataTask *task = [session dataTaskWithURL:url];
[task resume];
记得添加代理 <NSURLSessionDataDelegate>
已经接收到响应头
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
//通过状态码来判断石是否成功
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (httpResponse.statusCode == 200) {
NSLog(@"请求成功");
NSLog(@"%@", httpResponse.allHeaderFields);
//初始化接受数据的NSData变量
_data = [[NSMutableData alloc] init];
//执行Block回调 来继续接收响应体数据
//执行completionHandler 用于使网络连接继续接受数据
/*
NSURLSessionResponseCancel 取消接受
NSURLSessionResponseAllow 继续接受
NSURLSessionResponseBecomeDownload 将当前任务 转化为一个下载任务
NSURLSessionResponseBecomeStream 将当前任务 转化为流任务
*/
completionHandler(NSURLSessionResponseAllow);
} else {
NSLog(@"请求失败");
}
}
接收到数据包时调用的代理方法
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
// NSLog(@"收到了一个数据包");
//拼接完整数据
[_data appendData:data];
NSLog(@"接受到了%li字节的数据", data.length);
}
数据接收完毕时调用的代理方法
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"数据接收完成");
if (error) {
NSLog(@"数据接收出错!");
//清空出错的数据
_data = nil;
} else {
//数据传输成功无误,JSON解析数据
// NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableLeaves error:nil];
// NSLog(@"%@", dic);
}
}
网友评论