自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS開(kāi)發(fā)3年只用5分鐘搞定面試官

移動(dòng)開(kāi)發(fā) iOS
假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假于物也。我們?cè)璋撞枨鍤g等一個(gè)人,曾借花開(kāi)花落嘆寵辱不驚。程序(Program)是一個(gè)可以運(yùn)行的文件, 一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程,即主線(xiàn)程

序言

假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假于物也。

我們?cè)璋撞枨鍤g等一個(gè)人,曾借花開(kāi)花落嘆寵辱不驚。

程序(Program)是一個(gè)可以運(yùn)行的文件, 一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程,即主線(xiàn)程

正文

  • 程序(Program)是一個(gè)可以運(yùn)行的文件, 一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程,即主線(xiàn)程
  • 進(jìn)程:正在進(jìn)行的程序被稱(chēng)為進(jìn)程,負(fù)責(zé)程序運(yùn)行的內(nèi)存分配,每個(gè)進(jìn)程都有自己的獨(dú)立虛擬內(nèi)存空間.一個(gè)程序的一次運(yùn)行,在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享一塊內(nèi)存
  • 什么是線(xiàn)程:線(xiàn)程是進(jìn)程中的基本單元(可執(zhí)行的代碼段),線(xiàn)程可以并發(fā)運(yùn)行,提高執(zhí)行效率
  • 創(chuàng)建線(xiàn)程的目的:就是為了開(kāi)啟一條新的可執(zhí)行的代碼段,與主線(xiàn)程中的代碼實(shí)現(xiàn)同時(shí)運(yùn)行,防止界面假死,是實(shí)現(xiàn)異步的技術(shù)的主要手段,比如網(wǎng)絡(luò)異步下載

一 Runloop知識(shí)點(diǎn)補(bǔ)充

1 在模擬器中拖拽UITextView的時(shí)候?qū)unLoop模式的影響

1.1 performSelector: 方法

—-對(duì)該方法的解釋: 該方法運(yùn)行的時(shí)候回受到runloop運(yùn)行模式的影響,默認(rèn)設(shè)置為defaulmode,當(dāng)拖拽的時(shí)候,runloop切換模式,所以不執(zhí)行

代碼塊和解釋一:

 

  1. //由于該方法設(shè)置了RunLoop的運(yùn)行模式為兩種,當(dāng)用戶(hù)滑動(dòng)UITextView的時(shí)候RunLoop切換模式并且繼續(xù)執(zhí)行,所以能設(shè)置出圖片 
  2.     [self.imageView1 performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"/Users/xiaofeng/Desktop/Snip20160319_18.png"] afterDelay:5.0 inModes:@[UITrackingRunLoopMode,NSDefaultRunLoopMode]]; 

代碼塊和解釋二:

 

  1. //該方法的執(zhí)行會(huì)受到外界的影響,當(dāng)用戶(hù)滑動(dòng)UITextView的時(shí)候,并不會(huì)經(jīng)過(guò)2秒設(shè)置圖片,runloop運(yùn)行的模式是默認(rèn)的模式,當(dāng)用戶(hù)滑動(dòng)UITextView的時(shí)候,切換了模式,所以不會(huì)設(shè)置圖片 
  2.     [self.imageView1 performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"/Users/xiaofeng/Desktop/Snip20160319_15.png"] afterDelay:2.0]; 

2 問(wèn)題:怎么能讓一個(gè)線(xiàn)程一直活著,然后在特定的情況下,讓線(xiàn)程跳轉(zhuǎn)任務(wù)

二 常駐線(xiàn)程

3 保證線(xiàn)程不死的方法:創(chuàng)建一個(gè)RunLoop循環(huán);然后設(shè)置數(shù)據(jù)源或者定時(shí)器

  • 3.1 ***種方法:開(kāi)啟一個(gè)死循環(huán)—>比如while死循環(huán),保持線(xiàn)程不死亡,這樣雖然能保證線(xiàn)程不死,但是不能保證線(xiàn)程去執(zhí)行其它的任務(wù)(不可取)
  • 3.2 第二種方法:開(kāi)啟一個(gè)RunLoop循環(huán),也可以保證讓線(xiàn)程不死,但是開(kāi)啟了需要手動(dòng)執(zhí)行,并且需要設(shè)置運(yùn)行模式,否則單單只是開(kāi)啟了RunLoop循環(huán),并沒(méi)有設(shè)置模式的話(huà),RunLoop開(kāi)啟了就直接退出,并不會(huì)一直往下執(zhí)行(開(kāi)啟RunLoop需要完成指定的三個(gè)步驟)

4 需求:當(dāng)點(diǎn)擊創(chuàng)建線(xiàn)程的按鈕的時(shí)候,開(kāi)始創(chuàng)建一條線(xiàn)程,然后點(diǎn)擊讓子線(xiàn)程開(kāi)始干其他的工作的時(shí)候,子線(xiàn)程開(kāi)始執(zhí)行其他工作

1 創(chuàng)建子線(xiàn)程按鈕:

 

  1. #pragma mark - 創(chuàng)建子線(xiàn)程按鈕 
  2. - (IBAction)creatBtnClick:(id)sender 
  3.     //創(chuàng)建子線(xiàn)程 
  4.     NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(task) object:nil]; 
  5.       
  6.     [thread start]; 
  7.     //如果不加入這句代碼,線(xiàn)程在執(zhí)行完task方法之后就會(huì)立刻被釋放,這里寫(xiě)這句代碼目的就是保證線(xiàn)程不死,能繼續(xù)執(zhí)行其他的任務(wù) 
  8.     self.thread = thread; 

創(chuàng)建子線(xiàn)程按鈕中的方法實(shí)現(xiàn): 在task方法中我們只要求打印當(dāng)前線(xiàn)程就行.

讓子線(xiàn)程開(kāi)始繼續(xù)工作:

 

  1. #pragma mark - 讓線(xiàn)程繼續(xù)工作 
  2.   
  3. - (IBAction)goOnBtnClick:(id)sender 
  4.     [self performSelector:@selector(task2) onThread:self.thread withObject:nil waitUntilDone:YES]; 

問(wèn)題:如果就這樣運(yùn)行的話(huà),就會(huì)報(bào)錯(cuò).

報(bào)錯(cuò)原因:雖然上面在創(chuàng)建子線(xiàn)程中已經(jīng)寫(xiě)了一句self.thread = thread保證子線(xiàn)程不會(huì)被釋放,但是由于沒(méi)有開(kāi)啟runloop循環(huán),那么子線(xiàn)程其實(shí)是處于死亡狀態(tài),所以當(dāng)在點(diǎn)擊讓子線(xiàn)程繼續(xù)工作的話(huà)就會(huì)報(bào)錯(cuò).

解決辦法:創(chuàng)建子線(xiàn)程的RunLoop,讓子線(xiàn)程一直在運(yùn)行,然后通過(guò)設(shè)置在方法里面的調(diào)用其它的需要子線(xiàn)程工作的方法,讓子線(xiàn)程去工作

 

  1. #pragma mark - 工作在線(xiàn)程中的任務(wù) 
  2. - (void)task 
  3.     NSLog(@"1------%@",[NSThread currentThread]); 
  4.     //創(chuàng)建RunLoop 
  5.     NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
  6.    
  7.     //創(chuàng)建timer(這種方法需要手動(dòng)設(shè)置模式) 
  8.     NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timeRun) userInfo:nil repeats:YES]; 
  9. // 
  10. //    //添加到runloop中,并設(shè)置模式 
  11.     [runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; 
  12. //    [runLoop addPort:[NSPort port] forMode:NSDefaultRunLoopMode]; 
  13.   
  14.     //開(kāi)啟runloop 
  15.   
  16.     [runLoop run]; 
  17.     NSLog(@"%s-------2-----%@",__func__,[NSThread currentThread]); 

注意:上面創(chuàng)建時(shí)鐘的代碼和添加時(shí)鐘到runloop中的代碼可以寫(xiě)成下面一句,同樣也能保證線(xiàn)程不處于死亡狀態(tài)

  1. [runLoop addPort:[NSPort port] forMode:NSDefaultRunLoopMode]; 

5 RunLoop的自動(dòng)釋放池

  • ***次創(chuàng)建 RunLoop啟動(dòng)的時(shí)候
  • ***一次 RunLoop退出的時(shí)候
  • 其它時(shí)間的創(chuàng)建和銷(xiāo)毀:當(dāng)RunLoop即將休眠的時(shí)候會(huì)把之前的自動(dòng)釋放池銷(xiāo)毀,重新創(chuàng)建一個(gè)新的

6 RunLoop在網(wǎng)絡(luò)中的應(yīng)用(直接看代碼就可以)

 

  1. - (void)delegate1 
  2.     //確定請(qǐng)求路徑 
  3.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  4.     //創(chuàng)建可變的請(qǐng)求對(duì)象 
  5.     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
  6.     //設(shè)置代理 
  7.     NSURLConnection *connention = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
  8.   
  9.     //加入該段代碼可以改變代理方法執(zhí)行的線(xiàn)程,默認(rèn)是在主線(xiàn)程中執(zhí)行,但是加入該段代碼之后,代理方法會(huì)在子線(xiàn)程中執(zhí)行 
  10.     [connention setDelegateQueue:[[NSOperationQueue alloc] init]]; 
  11.   
  12.     //開(kāi)始發(fā)送請(qǐng)求 
  13.     //1)該方法內(nèi)部會(huì)吧connention對(duì)象作為一個(gè)source添加到runloop中,并且制定運(yùn)行模式為默認(rèn) 
  14.     //2)如果發(fā)現(xiàn)當(dāng)前的runloop不存在,那么該方法內(nèi)部會(huì)自動(dòng)的創(chuàng)建并開(kāi)啟當(dāng)前子線(xiàn)程的runloop 
  15.     [connention start]; 

三 網(wǎng)絡(luò)

1 GET和POST對(duì)比:

  • GET請(qǐng)求參數(shù)直接跟在URL后面(?)
  • POST請(qǐng)求參數(shù)是在請(qǐng)求體里面

2 HTTP基本通信過(guò)程:客戶(hù)端—>請(qǐng)求—->服務(wù)器;服務(wù)器—>響應(yīng)—->客戶(hù)端

 

  1. 具體的操作步驟: 
  2. 2.1 確定請(qǐng)求路徑 
  3. 2.2 獲取主機(jī)名 
  4. 2.3 DNS域名解析 
  5. 2.4 獲得端口號(hào) 
  6. 2.5 鏈接到120.25.226.186的端口80 
  7. 2.6 發(fā)送一個(gè)HTTP GET請(qǐng)求 
  8. 2.7 接收服務(wù)器的響應(yīng) 
  9. 2.8 關(guān)閉鏈接 

3 請(qǐng)求和響應(yīng)

請(qǐng)求:

  • 請(qǐng)求頭:包含了客戶(hù)端的環(huán)境描述,客戶(hù)端請(qǐng)求信息等
  • 請(qǐng)求體:客戶(hù)端發(fā)給服務(wù)器的具體數(shù)據(jù),比如文件數(shù)據(jù)(POST請(qǐng)求才會(huì)有)

響應(yīng):

  • 響應(yīng)頭:包含了對(duì)服務(wù)器的描述,對(duì)返回?cái)?shù)據(jù)的描述
  • 響應(yīng)體:服務(wù)器返回給客戶(hù)端的具體數(shù)據(jù),比如文件數(shù)據(jù)

如圖:

 

4 HTTP請(qǐng)求

HTTP請(qǐng)求的第三方框架:ASIHttpRequest(已經(jīng)棄用);AFNetworking(主用);MKNetworking

蘋(píng)果自帶的:

  • NSURLConnection:用法簡(jiǎn)單,最古老最經(jīng)典最直接的一種方案
  • NSURLSession:功能比NSURLConnection更強(qiáng)大,蘋(píng)果目前比較推薦的使用技術(shù)(重要)
  • CFNetwork:NSURL*的底層,純C語(yǔ)言

第三方框架:(企業(yè)開(kāi)發(fā)基本使用的是第三方框架)

  • ASIHttpRequest:外號(hào)”HTTP終結(jié)者”,功能極其強(qiáng)大,可惜已經(jīng)停止更新了
  • AFNetworking:簡(jiǎn)單易用,提供了基本夠用的常用功能,維護(hù)和使用者多(重要)
  • MKNsetworking:簡(jiǎn)單易用,產(chǎn)生三哥的故鄉(xiāng)印度,維護(hù)和使用者少

四 GET方式

  • 概念:發(fā)送網(wǎng)絡(luò)請(qǐng)求的兩種方式,主要區(qū)別上面已經(jīng)有寫(xiě)
  • 發(fā)送同步請(qǐng)求

具體步驟:

 

  1. 1> 確定請(qǐng)求路徑 
  2. 2> 創(chuàng)建請(qǐng)求對(duì)象 
  3. 3> 發(fā)送請(qǐng)求 
  4. 4 > 解析接收數(shù)據(jù) 

 

  1. #pragma mark - 發(fā)送同步請(qǐng)求 
  2. - (void)sendSync 
  3.     //確定請(qǐng)求路徑 
  4.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  5.   
  6.     //創(chuàng)建請(qǐng)求對(duì)象 
  7.     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
  8.   
  9.     //初始化響應(yīng)頭信息(設(shè)置為空) 
  10.     NSHTTPURLResponse *response = nil; 
  11.     //初始化錯(cuò)誤信息 
  12.     NSError *error = nil; 
  13.   
  14.     //發(fā)送請(qǐng)求 
  15.     /** 
  16.      *  ***個(gè)參數(shù):請(qǐng)求對(duì)象 
  17.      * 
  18.      *  第二個(gè)參數(shù):響應(yīng)頭信息(傳入的是地址) 
  19.      * 
  20.      *  第三個(gè)參數(shù):錯(cuò)誤信息(如果發(fā)送請(qǐng)求失敗,那么error就有值)(傳入的是地址) 
  21.      */ 
  22.     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
  23.   
  24.     //解析返回的響應(yīng)數(shù)據(jù) 
  25.     NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 

3 發(fā)送異步請(qǐng)求

注意:同步請(qǐng)求和異步請(qǐng)求的主要區(qū)別就是發(fā)送請(qǐng)求中的方法不同.

 

  1. #pragma mark - 發(fā)送異步請(qǐng)求 
  2.   
  3. - (void)sendAsync 
  4.     //確定請(qǐng)求路徑 
  5.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  6.   
  7.     //創(chuàng)建請(qǐng)求對(duì)象 
  8.     NSURLRequest *resquest = [NSURLRequest requestWithURL:url]; 
  9.   
  10.     //發(fā)送請(qǐng)求 
  11.     /** 
  12.      *  參數(shù)一:請(qǐng)求對(duì)象 
  13.      * 
  14.      *  參數(shù)二:隊(duì)列(作用在completionHandler上面) 
  15.      * 
  16.      *  參數(shù)三:響應(yīng)的信息(響應(yīng)頭;響應(yīng)的數(shù)據(jù)) 
  17.                 response 響應(yīng)頭信息 
  18.                 data     響應(yīng)體信息 
  19.                 connectionError 錯(cuò)誤信息 
  20.      */ 
  21.     [NSURLConnection sendAsynchronousRequest:resquest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 
  22.         //解析數(shù)據(jù) 
  23.         NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  24.     }]; 

4 用代理的方法發(fā)送網(wǎng)絡(luò)請(qǐng)求

注意:需要遵守協(xié)議:

  1. <nsurlconnectiondatadelegate></nsurlconnectiondatadelegate> 

代理方法發(fā)送,里面包括了設(shè)置代理的三種方式

 

  1. #pragma mark - 代理方法發(fā)送請(qǐng)求 
  2. - (void)sendAsyncDelegate 
  3.     //確定請(qǐng)求路徑 
  4.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  5.   
  6.     //創(chuàng)建請(qǐng)求對(duì)象 
  7.     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
  8.   
  9.     //設(shè)置代理 
  10.     //***種設(shè)置代理: 
  11.     [NSURLConnection connectionWithRequest:request delegate:self]; 
  12.     //第二種設(shè)置代理: 
  13.     NSURLConnection *connecttion1 = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
  14.     //第三種設(shè)置代理: 
  15.     NSURLConnection *connecttion2 = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
  16.   
  17.     [connecttion2 start];   

實(shí)現(xiàn)代理中的方法

 

  1. #pragma mark - 代理方法 
  2. //請(qǐng)求失敗的時(shí)候調(diào)用 
  3. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
  4.     NSLog(@"%s------%@",__func__,[NSThread currentThread]); 
  5. //接收響應(yīng)頭信息 
  6. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
  7.     NSLog(@"%s------%@",__func__,[NSThread currentThread]); 
  8.   
  9.     //創(chuàng)建接收可變的二進(jìn)制數(shù)據(jù) 
  10.     self.responseData = [NSMutableData data]; 
  11.   
  12. //接收響應(yīng)體(如果數(shù)據(jù)足夠大那么這個(gè)方法會(huì)調(diào)用多次) 
  13. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
  14.     NSLog(@"%s------%@",__func__,[NSThread currentThread]); 
  15.     //拼接二進(jìn)制數(shù)據(jù) 
  16.     [self.responseData appendData:data]; 
  17.   
  18. //接收完成(不管成功還是失敗) 
  19. - (void)connectionDidFinishLoading:(NSURLConnection *)connection 
  20.     NSLog(@"%s------%@",__func__,[NSThread currentThread]); 
  21.   
  22.     //解析數(shù)據(jù) 
  23.     NSLog(@"%@",[[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]); 

五 POST方式

1 直接看代碼,上面都標(biāo)明了

 

  1. - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event 
  2.     //創(chuàng)建請(qǐng)求路徑 
  3.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"]; 
  4.     //創(chuàng)建可變的請(qǐng)求對(duì)象 
  5.     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
  6.   
  7.     //修改請(qǐng)求方式 
  8.     request.HTTPMethod = @"POST"
  9.   
  10.     //設(shè)置請(qǐng)求超時(shí) 
  11.     request.timeoutInterval = 10; 
  12.   
  13.     NSURLResponse *response = nil; 
  14.   
  15.     NSError *error = nil; 
  16.   
  17.     //設(shè)置請(qǐng)求頭信息 
  18.     [request setValue:@"jjjj" forHTTPHeaderField:@"uuuuu"]; 
  19.   
  20.     //設(shè)置請(qǐng)求體(參數(shù)) 
  21.     request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding]; 
  22.   
  23.     //***種方法:發(fā)送請(qǐng)求(異步請(qǐng)求) 
  24.     [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 
  25.         //解析數(shù)據(jù) 
  26.         if (connectionError == nil) { 
  27.             NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  28.   
  29.         }else
  30.             NSLog(@"%@",connectionError); 
  31.         } 
  32.     }]; 
  33.   
  34.     //第二種方法:發(fā)送請(qǐng)求(同步請(qǐng)求) 
  35.     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
  36.     //解析數(shù)據(jù) 
  37.     NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 

六 中文轉(zhuǎn)碼

  1. 判斷需不需要轉(zhuǎn)碼操作:看請(qǐng)求路徑是否含有中文,含有的話(huà),就需要轉(zhuǎn)碼
  2. 設(shè)置代理的多一個(gè)參數(shù)的方法中:如果設(shè)置的為NO,那么手動(dòng)開(kāi)啟的時(shí)候,底層start會(huì)把線(xiàn)程加入到runloop中,但是如果設(shè)置的為yes,那么和沒(méi)有參數(shù)的時(shí)候一樣,需要手動(dòng)創(chuàng)建runloop.

GET轉(zhuǎn)碼:

 

  1. #pragma mark - GET轉(zhuǎn)碼 
  2. - (void)get 
  3.     //確定請(qǐng)求字符串 
  4.     NSString *strurl = @"http://120.25.226.186:32812/login2?username=(需要轉(zhuǎn)的漢字)&pwd=520it&type=JSON"
  5.   
  6.     //轉(zhuǎn)碼 
  7.     strurl = [strurl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
  8.   
  9.     //確定路徑 
  10.     NSURL *url = [NSURL URLWithString:strurl]; 
  11.   
  12.     //創(chuàng)建可變的請(qǐng)求對(duì)象 
  13.     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
  14.   
  15.     //發(fā)送請(qǐng)求--->GET請(qǐng)求 
  16.     [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 
  17.        //解析數(shù)據(jù) 
  18.         if (connectionError == nil) { 
  19.             NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  20.         }else
  21.             NSLog(@"%@",connectionError); 
  22.         } 
  23.     }]; 

POST轉(zhuǎn)碼:

 

  1. #pragma mark - POST轉(zhuǎn)碼 
  2. - (void)post 
  3.     //確定請(qǐng)求路徑的字符串 
  4.     NSString *urlstr = @"http://120.25.226.186:32812/login2"
  5.   
  6.     //確定url 
  7.     NSURL *url = [NSURL URLWithString:urlstr]; 
  8.   
  9.     //創(chuàng)建請(qǐng)求對(duì)象 
  10.     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
  11.   
  12.     //轉(zhuǎn)為POST格式 
  13.     request.HTTPMethod = @"POST"
  14.     //轉(zhuǎn)碼 
  15.     request.HTTPBody = [@"username=(需要轉(zhuǎn)的漢字)&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding ]; 
  16.     NSURLResponse *response = nil; 
  17.     NSError *error = nil; 
  18.   
  19.     //發(fā)送請(qǐng)求(同步請(qǐng)求) 
  20.     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
  21.     //解析數(shù)據(jù) 
  22.     NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  23.   
  24.     //發(fā)送請(qǐng)求(異步請(qǐng)求) 
  25.     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 
  26.         //解析數(shù)據(jù) 
  27.         if (connectionError == nil) { 
  28.             NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  29.         }else
  30.             NSLog(@"%@",connectionError); 
  31.         } 
  32.   
  33.     }];     

七 NSURLSession簡(jiǎn)單使用

1 NSURLSession —->GET用法:

 

  1. - (void)get 
  2.     //確定請(qǐng)求路徑 
  3.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  4.     //創(chuàng)建請(qǐng)求對(duì)象 
  5.     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url ]; 
  6.     //獲取會(huì)話(huà)對(duì)象(是一個(gè)單例) 
  7.     NSURLSession *session = [NSURLSession sharedSession]; 
  8.   
  9.     //根據(jù)會(huì)話(huà)對(duì)象創(chuàng)建task 
  10.     /** 
  11.      *  參數(shù)一:請(qǐng)求對(duì)象 
  12.      * 
  13.      *  參數(shù)二:響應(yīng)頭response信息;響應(yīng)體data信息;error錯(cuò)誤信息 
  14.      * 
  15.      * 
  16.      */ 
  17.     NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
  18.         //解析數(shù)據(jù) 
  19.         NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  20.         //該block塊是在子線(xiàn)程中調(diào)用 
  21.          NSLog(@"%@",[NSThread currentThread]); 
  22.     } ]; 
  23.   
  24.     //執(zhí)行task 
  25.     [dataTask resume]; 

2 GET用法二:

 

  1. - (void)get1 
  2.     //確定請(qǐng)求路徑 
  3.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  4.   
  5.     //創(chuàng)建請(qǐng)求對(duì)象 
  6. //    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
  7.   
  8.     //創(chuàng)建會(huì)話(huà)對(duì)象 
  9.     NSURLSession *session = [NSURLSession sharedSession]; 
  10.   
  11.     //根據(jù)會(huì)話(huà)對(duì)象創(chuàng)建task 
  12.     NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
  13.         NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  14.         //該block塊是在子線(xiàn)程中調(diào)用 
  15.          NSLog(@"%@",[NSThread currentThread]); 
  16.     }]; 
  17.     //開(kāi)啟task 
  18.     [dataTask resume]; 

3 GET1和GET2的區(qū)別是根據(jù)會(huì)話(huà)對(duì)象創(chuàng)建task不同,其實(shí)用法還是一樣的.

4 POST用法:

 

  1. - (void)post 
  2.     //確定請(qǐng)求路徑 
  3.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"]; 
  4.   
  5.     //創(chuàng)建可變的請(qǐng)求對(duì)象 
  6.     NSMutableURLRequest *resquest = [NSMutableURLRequest requestWithURL:url]; 
  7.   
  8.     //轉(zhuǎn)換格式 
  9.     resquest.HTTPMethod = @"POST"
  10.   
  11.     //設(shè)置請(qǐng)求體信息 
  12.     resquest.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding]; 
  13.   
  14.     //獲取會(huì)話(huà) 
  15.     NSURLSession *session = [NSURLSession sharedSession]; 
  16.   
  17.     //用會(huì)話(huà)對(duì)象創(chuàng)建task 
  18.     NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:resquest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
  19.   
  20.         //解析數(shù)據(jù) 
  21.         if (error == nil) { 
  22.             NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
  23.         }else
  24.             NSLog(@"%@",error); 
  25.         } 
  26.         //該block塊是在子線(xiàn)程中調(diào)用 
  27.         NSLog(@"%@",[NSThread currentThread]); 
  28.     }]; 
  29.   
  30.     //執(zhí)行task任務(wù)   resume------>恢復(fù) 
  31.     [dataTask resume]; 

八 NSURLSession的代理方法

1 主方法(在里面設(shè)置代理)

 

  1. - (void)sessionGet 
  2.     //確定請(qǐng)求路徑 
  3.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  4.     //創(chuàng)建可變的請(qǐng)求對(duì)象 
  5.     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
  6.   
  7.     //獲取會(huì)話(huà)(delegateQueue:決定了代理的任務(wù)是在子線(xiàn)程還是主線(xiàn)程中執(zhí)行的) 
  8.     NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 
  9.   
  10.     //創(chuàng)建task 
  11.     NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; 
  12.     //執(zhí)行task任務(wù) 
  13.     [dataTask resume]; 
  14.   

2 代理方法

注意: 此代理方法要特別的注意***個(gè)代理方法,因?yàn)樾枰卣{(diào)告訴系統(tǒng)怎么樣處理服務(wù)器返回的數(shù)據(jù),如果沒(méi)有寫(xiě)的話(huà),后面兩個(gè)代理方法是不會(huì)調(diào)用的,因?yàn)閏ompletionHandler并沒(méi)有告訴系統(tǒng),服務(wù)器的數(shù)據(jù)怎么處理.

 

  1. #pragma mark - 代理方法 
  2. //接收響應(yīng) 
  3. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler 
  4.     NSLog(@"%s-------%@",__func__,[NSThread currentThread]); 
  5.   
  6.     self.data = [NSMutableData data]; 
  7.     //在該方法中需要通過(guò)completionHandler回調(diào)告訴系統(tǒng)應(yīng)該如何處理服務(wù)器返回的數(shù)據(jù) 
  8.     completionHandler(NSURLSessionResponseAllow); 
  9. //接收到二進(jìn)制數(shù)據(jù)(如果數(shù)據(jù)量大會(huì)調(diào)用多次) 
  10. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
  11.   
  12.     NSLog(@"%s-----%@",__func__,[NSThread currentThread]); 
  13.     //拼接數(shù)據(jù) 
  14.     [self.data appendData:data]; 
  15.   
  16. //完成或者失敗的時(shí)候調(diào)用 
  17. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 
  18.     NSLog(@"%s------%@",__func__,[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]); 
  19.     NSLog(@"%@",[NSThread currentThread]); 

 

責(zé)任編輯:未麗燕 來(lái)源: 簡(jiǎn)書(shū)
相關(guān)推薦

2011-05-26 09:03:17

JSONjavascript

2009-11-26 11:19:52

NIS服務(wù)器

2010-03-05 17:28:08

2016-04-06 11:14:48

iOS相機(jī)自定義

2013-06-24 15:32:41

JPush極光推送Android Pus移動(dòng)開(kāi)發(fā)

2020-12-18 07:33:20

SpringSchedule組件

2012-06-28 10:26:51

Silverlight

2020-09-14 11:30:26

HTTP3運(yùn)維互聯(lián)網(wǎng)

2021-12-10 06:52:24

業(yè)務(wù)

2010-11-03 11:01:05

求職面試

2021-04-30 16:23:58

WebRTC實(shí)時(shí)音頻

2021-12-01 06:50:50

Docker底層原理

2014-04-15 11:19:19

2020-10-27 10:43:24

Redis字符串數(shù)據(jù)庫(kù)

2011-07-11 09:58:52

2020-12-09 06:19:39

ReLU神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)

2015-04-21 17:35:29

代碼

2020-07-25 19:40:33

Java開(kāi)發(fā)代碼

2025-03-18 09:20:00

Go語(yǔ)言Golang

2021-12-02 06:58:03

AIOps通信服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)