1.通過NSURLSessionDelegate來下載
#import "URLSessionViewController.h"
@interface URLSessionViewController ()<NSURLSessionDataDelegate>
@property (nonatomic, strong) NSMutableData *responseData;
@end
@implementation URLSessionViewController
-(NSMutableData *)responseData
{
if (_responseData == nil) {
_responseData = [NSMutableData data];
}
return _responseData;
}
//當(dāng)點(diǎn)擊控制器View的時(shí)候會(huì)調(diào)用該方法
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self delegateTest];
}
2.創(chuàng)建NSURLSession對(duì)象并設(shè)置代理
-(void)delegateTest
{
//1.確定請(qǐng)求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2.創(chuàng)建請(qǐng)求對(duì)象
//請(qǐng)求對(duì)象內(nèi)部默認(rèn)已經(jīng)包含了請(qǐng)求頭和請(qǐng)求方法(GET)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.獲得會(huì)話對(duì)象,并設(shè)置代理
/*
第一個(gè)參數(shù):會(huì)話對(duì)象的配置信息defaultSessionConfiguration 表示默認(rèn)配置
第二個(gè)參數(shù):誰成為代理藏澳,此處為控制器本身即self
第三個(gè)參數(shù):隊(duì)列曼尊,該隊(duì)列決定代理方法在哪個(gè)線程中調(diào)用重挑,可以傳主隊(duì)列|非主隊(duì)列
[NSOperationQueue mainQueue] 主隊(duì)列: 代理方法在主線程中調(diào)用
[[NSOperationQueue alloc]init] 非主隊(duì)列: 代理方法在子線程中調(diào)用
*/
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//4.根據(jù)會(huì)話對(duì)象創(chuàng)建一個(gè)Task(發(fā)送請(qǐng)求)
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//5.執(zhí)行任務(wù)
[dataTask resume];
}
3.代理方法實(shí)現(xiàn)
//1.接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用該方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
//在該方法中可以得到響應(yīng)頭信息,即response
NSLog(@"didReceiveResponse--%@",[NSThread currentThread]);
//注意:需要使用completionHandler回調(diào)告訴系統(tǒng)應(yīng)該如何處理服務(wù)器返回的數(shù)據(jù)
//默認(rèn)是取消的
/*
NSURLSessionResponseCancel = 0, 默認(rèn)的處理方式踪央,取消
NSURLSessionResponseAllow = 1, 接收服務(wù)器返回的數(shù)據(jù)
NSURLSessionResponseBecomeDownload = 2,變成一個(gè)下載請(qǐng)求
NSURLSessionResponseBecomeStream 變成一個(gè)流
*/
completionHandler(NSURLSessionResponseAllow);
}
//2.接收到服務(wù)器返回?cái)?shù)據(jù)的時(shí)候會(huì)調(diào)用該方法,如果數(shù)據(jù)較大那么該方法可能會(huì)調(diào)用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"didReceiveData--%@",[NSThread currentThread]);
//拼接服務(wù)器返回的數(shù)據(jù)
[self.responseData appendData:data];
}
//3.當(dāng)請(qǐng)求完成(成功|失敗)的時(shí)候會(huì)調(diào)用該方法,如果請(qǐng)求失敗祈坠,則error有值
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError--%@",[NSThread currentThread]);
if(error == nil)
{
//解析數(shù)據(jù),JSON解析請(qǐng)參考http://www.cnblogs.com/wendingding/p/3815303.html
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:nil];
NSLog(@"%@",dict);
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者