NSURLSession 数据请求,下载,上传
#import "ViewController.h"
#define BASE_URL @"http://iappfree.candou.com:8080/free/applications/limited"
#define IMG_URL @"http://a.hiphotos.baidu.com/image/pic/item/55e736d12f2eb938d3de795ad0628535e4dd6fe2.jpg"
@interface ViewController () <NSURLSessionDownloadDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//NSURLConnection 在iOS 8之后已经不推荐使用了,
//苹果建议,用NSURLSession 来做数据请求
//session有三种任务模式
//1、dataTask 数据请求任务(默认)
[self session];
//2、downloadTask 下载任务
//3、uploadTask 上传任务
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// [self downloadTak];
[self downloadTak2];
}
#pragma mark ------------下载任务-------------
- (void)downloadTak {
//1、获取session 单例
NSURLSession *session = [NSURLSession sharedSession];
//2、下载任务
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:IMG_URL] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
//这里是下载的回调
//location:表示文件下载的位置
NSLog(@"%@",location.absoluteString);
//沙盒
//因为下载的路径,默认是tmp文件夹下面的,所以我们需要在下载完成之后,把内容拷贝到新的位置 Document下面
// NSFileManager *manager = [NSFileManager defaultManager];
// manager copyItemAtPath:<#(NSString *)#> toPath:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>
}];
//3、开始任务
[task resume];
}
//有进度的下载
- (void)downloadTak2 {
//1、实例化一个session,并且设置代理
//session 还有三种会话模式
//
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
//2、开启一个下载任务
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:IMG_URL]];
//3、开始下载
[task resume];
}
#pragma mark --------有进度的下载的协议方法-------------
//下载完成之后的回调
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
NSLog(@"%@",location);
}
//有关进度
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
//后两个参数
//totalBytesWritten 表示已经下载的大小
//totalBytesExpectedToWrite 表示总大小
float progress = totalBytesWritten / (float)totalBytesExpectedToWrite;
NSLog(@"%f",progress);
}
#pragma mark ---------数据请求任务----------
- (void)session {
//1、实例化一个session
NSURLSession *session = [NSURLSession sharedSession];
//2、数据请求任务
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:IMG_URL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//这里是数据请求后,服务器的响应
//data:请求到的数据
//response:响应头
//error:错误日志
if (error) {
//请求失败
NSLog(@"%@",error);
}else {
// //请求成功
// NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// NSLog(@"%@",dict);
//1、实例化一个imageView 并展示图片
#warning 所谓异步请求,其实就是开辟了一个新的线程(子线程),在子线程中进行同步的请求,线程我们可以理解为一个通道,NSURLSession数据请求成功后,依然在子线程里面做的回调,然而子线程里面是不能够进行UI操作的
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
imageView.image = [UIImage imageWithData:data];
[self.view addSubview:imageView];
NSLog(@"加载完成");
});
}
}];
//3、开始任务
[task resume];
}
@end
NSURLSession 数据请求.png
网友评论