和異步的GET和POST一樣 , 獲取數(shù)據(jù)可以有兩種方法: 代理 + block
文中的url字符串都是宏定義的對(duì)象
getSession 和postSession實(shí)現(xiàn)步驟的區(qū)別
屏幕快照 2016-07-04 下午9.27.21.png
1. getSession
- (void)getSession{
//第一步: 獲取URL
NSURL *url = [NSURL URLWithString:GET_URL];
//第二步: block
/*
//第二步: 創(chuàng)建NSURLSession對(duì)象
//NSURLSession: 是基于任務(wù)完成相關(guān)的事件, 所有內(nèi)容都放到該任務(wù)中
NSURLSession *session = [NSURLSession sharedSession];//使用的是系統(tǒng)提供的全局單例
//第三步: 通過(guò)url創(chuàng)建任務(wù)task對(duì)象
//NSURLSessionTask: 就是NSURLSession任務(wù)執(zhí)行對(duì)象
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(@"%@", dic);
}
}];*/
//第二步: 代理方式
//第二步: 創(chuàng)建NSURLSession對(duì)象
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//第三步: 通過(guò)url創(chuàng)建Task
NSURLSessionTask *task = [session dataTaskWithURL:url];
//第四步: 執(zhí)行任務(wù)
[task resume];
}```
###2. postSession
```code
- (void)postSession{
//第一步: 或取URL
NSURL *url = [NSURL URLWithString:POST_URL];
//第二步: 創(chuàng)建請(qǐng)求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//第三步: 設(shè)置Body
//設(shè)置body信息
NSString *bodyStr = POST_BODY;
NSData *data = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//設(shè)置請(qǐng)求方法
[request setHTTPMethod:@"POST"];
//第四步: 創(chuàng)建Session對(duì)象
NSURLSession *session = [NSURLSession sharedSession];
//第五步: 創(chuàng)建任務(wù)Task(不同與GET --> dataTaskWithRequest)
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"%@", dic);
}
}];
//第六步: 啟動(dòng)請(qǐng)求
[task resume];
}```
###NSURLSessionDataDelegate代理方法
```code
//服務(wù)器開(kāi)始響應(yīng), 準(zhǔn)備返回?cái)?shù)據(jù)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
//允許服務(wù)器的響應(yīng), 才會(huì)繼續(xù)接收服務(wù)器返回的數(shù)據(jù)
completionHandler(NSURLSessionResponseAllow);
//初始化數(shù)據(jù)源
self.sessionData = [NSMutableData data];
}
//客戶端接收數(shù)據(jù)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data{
[self.sessionData appendData:data];
}
//數(shù)據(jù)接收完成, 結(jié)束響應(yīng)
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
if (error == nil) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.sessionData options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"%@", dic);
}
}```