NSURLSession是蘋果公司在IOS7上推出的針對http歧胁、https報文收發(fā)的系統(tǒng)網(wǎng)絡庫铛楣。著名的AFNetworking3.0開源庫就是基于NSURLSession再封裝而來。首先先講一下NSURLSession的一些基礎用法骏令。
文中的代碼案例在如下地址可以下載到 https://github.com/yan0219/iosNetTest
想使用NSURLSession發(fā)送http報文大致有以下幾步需要做:
1.初始化一個NSURLSession對象则果,session對象可以用來管理多個http報文發(fā)送的任務岳掐,根據(jù)需要創(chuàng)建管理多線程棠赛,后面還會講到更復雜的上傳哮奇、下載膛腐、后臺下載等工作都可以使用session對象來處理。
一般情況下一個APP只需要初始化一個session對象鼎俘,除非你有業(yè)務上的需求哲身,需要分開多個session管理你的http報文發(fā)送,否則只需要初始化一個公共的session對象就可以了贸伐。
初始化session的第一步是先初始化一個NSURLSessionConfiguration對象勘天。也就是session的一個配置類。然后再初始化session捉邢,代碼如下:
//初始化一個NSUrlSession對象脯丝,之后的報文發(fā)送都使用該對象
- (void)initSession
{
? ? //初始化一個session的配置對象
? ? NSURLSessionConfiguration* yConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
? ? /*初始化一個session對象,其中三個參數(shù)分別是
?? ? *configuration:配置對象
?? ? *delegate:session處理代理的對象
?? ? *delegateQueue:代理的消息處理的線程歌逢,這里傳mainQueue巾钉,代理的消息都會在主線程中收到
? ? */
? ? self.curSession = [NSURLSession sessionWithConfiguration:yConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
}
2.第二步就是初始化一個NSMutableURLRequest對象,這里大家應該比較熟悉秘案,http報文的head、body潦匈、url阱高、method等都可以在這里進行初始化。
//初始化一個request對象
? ? NSURL* curUrl = [NSURL URLWithString:@"https://open.beva.com/v1/auth/get-salt-code"];
? ? NSMutableURLRequest* curRequest = [[NSMutableURLRequest alloc] initWithURL:curUrl];
3.使用session對象茬缩,通過初始化好的request對象來創(chuàng)建一個task任務對象
? ? 這里初始化task時赤惊,會傳入一個Handler的block對象,當http報文收到返回時凰锡,就會通過這個handler的block將返回的信息傳回來未舟。
之前初始化session的時候大家看到了,為session設置了一個delegate和delegate消息響應的線程掂为。這里要說明一下裕膀,如果初始化一個task時,使用了下面的這種簡易方法勇哗,傳入了一個handler來處理返回消息昼扛,那么該task就不會再調用session對象的delegate方法,使用這里傳入的block代替了delegate方法欲诺。但是session對象設置的代理響應的線程仍然起作用抄谐,比如上面我初始化session的時候,傳入的delegateQueue參數(shù)是主線程扰法,那么這里handler這個block返回時也是在主線程中蛹含。
//生成一個task對象
? ? NSURLSessionDataTask* curTask = [self.curSessiondataTaskWithRequest:curRequestcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {
? ? ? ? NSString* saltString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
? ? ? ? NSDictionary* dataDic = [selfdictionaryWithJsonString:saltString];
? ? ? ? NSLog(@"receive data : %@,in %@",[dataDic description],[NSThread currentThread]);
? ? }];
4.第四步啟動這個task任務
????//啟動task任務
? ? [curTaskresume];
至此一個http報文的收發(fā)就結束了。
還需要說明一點塞颁,如果初始化一個session對象的時候并沒有設置delegate(代理)以及delegateQueue(代理響應線程)的參數(shù)
NSURLSession* testSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
那么在生成一個task對象的時候又使用了簡易方法傳入了一個handler的block浦箱。那么block返回的時候很可能在不同的線程中卧斟,如果在子線程中,想要刷新界面的話需要返回主線程刷新憎茂,代碼如下:
//生成一個task對象
? ? NSURLSessionDataTask* curTask = [self.curSessiondataTaskWithRequest:curRequestcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {
? ? ? ? NSString* saltString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
? ? ? ? NSDictionary* dataDic = [selfdictionaryWithJsonString:saltString];
? ? ? ? NSLog(@"receive data : %@,in %@",[dataDic description],[NSThread currentThread]);
? ? ? ? //返回主線程刷新界面
? ? ? ? [self performSelectorOnMainThread:@selector(refreshView) withObject:nil waitUntilDone:NO];
? ? ? ? //返回主線程刷新界面
? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? //刷新頁面
? ? ? ? });
? ? }];