//
// ViewController.m
#define ImageUrl @"http://baike.soso.com/p/20090711/20090711101754-314944703.jpg"
//#define ImageUrl @"http://f.hiphotos.baidu.com/image/h%3D360/sign=9eae7c3766d9f2d33f1122e999ed8a53/3bf33a87e950352a230666de5743fbf2b3118b85.jpg"
#define POST @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?"
#define PostBody @"date=20151129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"
#import "ViewController.h"
@interface ViewController ()<NSURLSessionDelegate,NSURLSessionTaskDelegate>
@property (strong, nonatomic) IBOutlet UIImageView *imageV;
@property (strong,nonatomic)NSData *data;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
// 1、创建会话配置对象(如果会话采用全局会话即 [NSURLSession sharedSession] ,那么配置对象可以省略)
// 2、创建会话(在这里可以决定采用delegate 或者block进行网络请求)
// 3、创建会话任务(需要传递参数网址url 或者请求 request()),如果需要设置POST请求,那么需要定义可变的请求对象且设置请求方式。如果仅仅是get请求,那么直接使用网址或者直接使用不可变请求都行
// 4、开始任务
- (IBAction)Post:(id)sender {
// 会话配置对象总共有三种
// NSURLSessionConfiguration
// 1、 默认会话配置对象,请求到的数据存储在本地磁盘
// defaultSessionConfiguration;
// 2、临时会话配置,请求到的数据存储在内存(RAM)中,程序退出,数据启动销毁
// ephemeralSessionConfiguration;
// 3、后台会话配置,支持后台下载上传,请求到的数据存储在本地磁盘
// backgroundSessionConfiguration
#pragma mark 网络请求第一步 产生会话配置对象(可选)
NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];
// 设置配置对象属性
// 设置 是否允许蜂窝网络请求
configure .allowsCellularAccess = YES;
// 设置当在后台,wifi情况下,而且电量充足请求网络
configure.discretionary = YES;
// 设置网络请求时间,超过这个时间会打印错误信息
configure.timeoutIntervalForRequest = 60;
// 设置缓存策略,当本地无缓存数据进行网络请求
configure.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
// 产生会话对象
// a、产生一个可变的网络请求
NSURL *url = [NSURL URLWithString:POST];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// b、设置请求的方式(post 或者 get),get请求默认不需要请求体和请求方式.
// 请求方式分为POST 和GET请求
// POST请求,采用密文输入(NSData类型)更安全,请求长度不限。
// GET 请求采用明文输入,请求长度不超过256个字符(最古老时)
[request setHTTPMethod:@"POST"];
// c、设置请求体
[request setHTTPBody:[PostBody dataUsingEncoding:NSUTF8StringEncoding]];
#pragma mark 第二步创建会话对象
// 创建会话的三种方式
// 1> sharedSession 使用共享会话,采用全局的证书,缓存等,可以不用创建配置对象(configure)
// 2> sessionWithConfiguration:采用自定义的配置创建会话,采用 block 请求数据。
// 3> sessionWithConfiguration: delegate: delegateQueue: 采用自定义的配置创建会话,采用delegate请求数据
// 4、创建会话
NSURLSession *session = [NSURLSession sessionWithConfiguration:configure];
#pragma matk 第三步 创建会话任务
// 5、会话任务 NSURLSessionTask 一般来说不直接使用,我们用其子类,子类有三个:
// a、NSURLSessionDataTask:用来前台下载数据,xml,json,图片等类型的数据。下载的数据不经过文件,直接提供给应用程序。
// b、NSURLSessionDownloadTask: 支持前,后台下载。下载的数据存储在本地,tmp文件夹路径下
// c、NSURLSessionUploadTask: 支持前后台上传,需要指定被上传的数据路径。
// session中调用的方法 都是以当前类的类名开头
// DataTask 请求, 则session 使用dataTask开头方法,downLoadTask 则,session 使用 downLoadTask 方法
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// response 关于数据的回应
// error 关于请求数据的错误信息
// data,这里的data是完整的数据
NSLog(@"%@",response);
NSLog(@"%@",error);
NSLog(@"%@",data);
// 解析数据
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray *arr = dic [@"news"];
for (NSDictionary *dic in arr) {
NSLog(@"%@",dic[@"title"]);
}
NSLog(@"%ld",dic.count);
// 根据二进制数据获取图片
UIImage *image = [UIImage imageWithData:data];
// 回到主线程刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
self.imageV.image = image;
});
}];
#pragma mark 第四步 开始任务
[task resume];
// ,根本解决办法 改协议,临时解决办法在Info.plist中添加 NSAppTransportSecurity 类型 Dictionary Dictionary 下添加 NSAllowsArbitraryLoads 类型 Boolean ,值设为 YES
}
// get请求,会话采用全局会话
- (IBAction)Get:(id)sender {
// 1、创建单例会话(全局会话)
NSURLSession *session = [NSURLSession sharedSession];
// 2、创建会话任务
//因为是get请求,因此不需要定义可变请求
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:ImageUrl] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 此处的data是完整的二进制数据
UIImage *image = [UIImage imageWithData:data];
//回到主线程刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
self.imageV.image = image;
});
}];
// 3、开始任务
[task resume];
}
// 采用默认会话配置,采用get请求,采用downLoadTask获取数据,采用block获取数据,
- (IBAction)Block:(id)sender {
// 创建会话配置对象
NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];
// 创建会话对象
NSURLSession *session = [NSURLSession sessionWithConfiguration:configure];
// 创建会话任务
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:ImageUrl] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 从图片中获取二进制数据
NSData *data = [NSData dataWithContentsOfURL:location];
// 将二进制数据转换为图片
UIImage *image = [UIImage imageWithData:data];
//刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
self.imageV.image = image;
});
}];
[task resume];
}
// 采用get请求,采用dataTask的 delegate获取数据
- (IBAction)Delegate:(id)sender {
// 创建默认配置会话
NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];
// 创建会话
// 队列可以给,可以不给,不给系统默认给你创建一个子线程。
NSURLSession *session = [NSURLSession sessionWithConfiguration:configure delegate:self delegateQueue:nil];
// 创建会话任务
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:ImageUrl]];
// 开始任务
[task resume];
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data{
self.data = data;
NSLog(@"%@",[NSOperationQueue currentQueue]);
// 如果在设置会话代理的时候将代理线程设置为主线程,那么这里不需要重新回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
self.imageV.image = [UIImage imageWithData:self.data];
});
}
// 采用默认配置
// 采用get请求
// 采用downLoadTask的Delegate获取数据
- (IBAction)DownLoadDelegate:(id)sender {
// 第一步 创建会话配置对象
NSURLSessionConfiguration *con = [NSURLSessionConfiguration defaultSessionConfiguration];
// 第二步 创建会话
NSURLSession *session = [NSURLSession sessionWithConfiguration:con delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 第三步 创建会话任务
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:ImageUrl]];
// 第四步 开始任务
[task resume];
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
// downLoadTask 下载的数据存储在tmp文件下,因此根据路径获取二进制数据
NSData *data = [NSData dataWithContentsOfURL:location];
// 为图片视图赋值
self.imageV.image = [UIImage imageWithData:data];
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
// 求出下载的百分比
float percent = totalBytesWritten / totalBytesExpectedToWrite * 1.0;
NSLog(@"%f%%",percent * 100);
}
@end