精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS開發3年只用5分鐘搞定面試官

移動開發 iOS
假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假于物也。我們曾借白茶清歡等一個人,曾借花開花落嘆寵辱不驚。程序(Program)是一個可以運行的文件, 一個程序至少有一個進程,一個進程至少有一個線程,即主線程

序言

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

我們曾借白茶清歡等一個人,曾借花開花落嘆寵辱不驚。

程序(Program)是一個可以運行的文件, 一個程序至少有一個進程,一個進程至少有一個線程,即主線程

正文

  • 程序(Program)是一個可以運行的文件, 一個程序至少有一個進程,一個進程至少有一個線程,即主線程
  • 進程:正在進行的程序被稱為進程,負責程序運行的內存分配,每個進程都有自己的獨立虛擬內存空間.一個程序的一次運行,在執行過程中擁有獨立的內存單元,而多個線程共享一塊內存
  • 什么是線程:線程是進程中的基本單元(可執行的代碼段),線程可以并發運行,提高執行效率
  • 創建線程的目的:就是為了開啟一條新的可執行的代碼段,與主線程中的代碼實現同時運行,防止界面假死,是實現異步的技術的主要手段,比如網絡異步下載

一 Runloop知識點補充

1 在模擬器中拖拽UITextView的時候對RunLoop模式的影響

1.1 performSelector: 方法

—-對該方法的解釋: 該方法運行的時候回受到runloop運行模式的影響,默認設置為defaulmode,當拖拽的時候,runloop切換模式,所以不執行

代碼塊和解釋一:

 

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

代碼塊和解釋二:

 

  1. //該方法的執行會受到外界的影響,當用戶滑動UITextView的時候,并不會經過2秒設置圖片,runloop運行的模式是默認的模式,當用戶滑動UITextView的時候,切換了模式,所以不會設置圖片 
  2.     [self.imageView1 performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"/Users/xiaofeng/Desktop/Snip20160319_15.png"] afterDelay:2.0]; 

2 問題:怎么能讓一個線程一直活著,然后在特定的情況下,讓線程跳轉任務

二 常駐線程

3 保證線程不死的方法:創建一個RunLoop循環;然后設置數據源或者定時器

  • 3.1 ***種方法:開啟一個死循環—>比如while死循環,保持線程不死亡,這樣雖然能保證線程不死,但是不能保證線程去執行其它的任務(不可取)
  • 3.2 第二種方法:開啟一個RunLoop循環,也可以保證讓線程不死,但是開啟了需要手動執行,并且需要設置運行模式,否則單單只是開啟了RunLoop循環,并沒有設置模式的話,RunLoop開啟了就直接退出,并不會一直往下執行(開啟RunLoop需要完成指定的三個步驟)

4 需求:當點擊創建線程的按鈕的時候,開始創建一條線程,然后點擊讓子線程開始干其他的工作的時候,子線程開始執行其他工作

1 創建子線程按鈕:

 

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

創建子線程按鈕中的方法實現: 在task方法中我們只要求打印當前線程就行.

讓子線程開始繼續工作:

 

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

問題:如果就這樣運行的話,就會報錯.

報錯原因:雖然上面在創建子線程中已經寫了一句self.thread = thread保證子線程不會被釋放,但是由于沒有開啟runloop循環,那么子線程其實是處于死亡狀態,所以當在點擊讓子線程繼續工作的話就會報錯.

解決辦法:創建子線程的RunLoop,讓子線程一直在運行,然后通過設置在方法里面的調用其它的需要子線程工作的方法,讓子線程去工作

 

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

注意:上面創建時鐘的代碼和添加時鐘到runloop中的代碼可以寫成下面一句,同樣也能保證線程不處于死亡狀態

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

5 RunLoop的自動釋放池

  • ***次創建 RunLoop啟動的時候
  • ***一次 RunLoop退出的時候
  • 其它時間的創建和銷毀:當RunLoop即將休眠的時候會把之前的自動釋放池銷毀,重新創建一個新的

6 RunLoop在網絡中的應用(直接看代碼就可以)

 

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

三 網絡

1 GET和POST對比:

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

2 HTTP基本通信過程:客戶端—>請求—->服務器;服務器—>響應—->客戶端

 

  1. 具體的操作步驟: 
  2. 2.1 確定請求路徑 
  3. 2.2 獲取主機名 
  4. 2.3 DNS域名解析 
  5. 2.4 獲得端口號 
  6. 2.5 鏈接到120.25.226.186的端口80 
  7. 2.6 發送一個HTTP GET請求 
  8. 2.7 接收服務器的響應 
  9. 2.8 關閉鏈接 

3 請求和響應

請求:

  • 請求頭:包含了客戶端的環境描述,客戶端請求信息等
  • 請求體:客戶端發給服務器的具體數據,比如文件數據(POST請求才會有)

響應:

  • 響應頭:包含了對服務器的描述,對返回數據的描述
  • 響應體:服務器返回給客戶端的具體數據,比如文件數據

如圖:

 

4 HTTP請求

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

蘋果自帶的:

  • NSURLConnection:用法簡單,最古老最經典最直接的一種方案
  • NSURLSession:功能比NSURLConnection更強大,蘋果目前比較推薦的使用技術(重要)
  • CFNetwork:NSURL*的底層,純C語言

第三方框架:(企業開發基本使用的是第三方框架)

  • ASIHttpRequest:外號”HTTP終結者”,功能極其強大,可惜已經停止更新了
  • AFNetworking:簡單易用,提供了基本夠用的常用功能,維護和使用者多(重要)
  • MKNsetworking:簡單易用,產生三哥的故鄉印度,維護和使用者少

四 GET方式

  • 概念:發送網絡請求的兩種方式,主要區別上面已經有寫
  • 發送同步請求

具體步驟:

 

  1. 1> 確定請求路徑 
  2. 2> 創建請求對象 
  3. 3> 發送請求 
  4. 4 > 解析接收數據 

 

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

3 發送異步請求

注意:同步請求和異步請求的主要區別就是發送請求中的方法不同.

 

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

4 用代理的方法發送網絡請求

注意:需要遵守協議:

  1. <nsurlconnectiondatadelegate></nsurlconnectiondatadelegate> 

代理方法發送,里面包括了設置代理的三種方式

 

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

實現代理中的方法

 

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

五 POST方式

1 直接看代碼,上面都標明了

 

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

六 中文轉碼

  1. 判斷需不需要轉碼操作:看請求路徑是否含有中文,含有的話,就需要轉碼
  2. 設置代理的多一個參數的方法中:如果設置的為NO,那么手動開啟的時候,底層start會把線程加入到runloop中,但是如果設置的為yes,那么和沒有參數的時候一樣,需要手動創建runloop.

GET轉碼:

 

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

POST轉碼:

 

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

七 NSURLSession簡單使用

1 NSURLSession —->GET用法:

 

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

2 GET用法二:

 

  1. - (void)get1 
  2.     //確定請求路徑 
  3.     NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
  4.   
  5.     //創建請求對象 
  6. //    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
  7.   
  8.     //創建會話對象 
  9.     NSURLSession *session = [NSURLSession sharedSession]; 
  10.   
  11.     //根據會話對象創建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塊是在子線程中調用 
  15.          NSLog(@"%@",[NSThread currentThread]); 
  16.     }]; 
  17.     //開啟task 
  18.     [dataTask resume]; 

3 GET1和GET2的區別是根據會話對象創建task不同,其實用法還是一樣的.

4 POST用法:

 

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

八 NSURLSession的代理方法

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

 

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

2 代理方法

注意: 此代理方法要特別的注意***個代理方法,因為需要回調告訴系統怎么樣處理服務器返回的數據,如果沒有寫的話,后面兩個代理方法是不會調用的,因為completionHandler并沒有告訴系統,服務器的數據怎么處理.

 

  1. #pragma mark - 代理方法 
  2. //接收響應 
  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.     //在該方法中需要通過completionHandler回調告訴系統應該如何處理服務器返回的數據 
  8.     completionHandler(NSURLSessionResponseAllow); 
  9. //接收到二進制數據(如果數據量大會調用多次) 
  10. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
  11.   
  12.     NSLog(@"%s-----%@",__func__,[NSThread currentThread]); 
  13.     //拼接數據 
  14.     [self.data appendData:data]; 
  15.   
  16. //完成或者失敗的時候調用 
  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]); 

 

責任編輯:未麗燕 來源: 簡書
相關推薦

2009-11-26 11:19:52

NIS服務器

2011-05-26 09:03:17

JSONjavascript

2010-03-05 17:28:08

2013-06-24 15:32:41

JPush極光推送Android Pus移動開發

2016-04-06 11:14:48

iOS相機自定義

2020-12-18 07:33:20

SpringSchedule組件

2012-06-28 10:26:51

Silverlight

2020-09-14 11:30:26

HTTP3運維互聯網

2021-12-10 06:52:24

業務

2010-11-03 11:01:05

求職面試

2021-04-30 16:23:58

WebRTC實時音頻

2021-12-01 06:50:50

Docker底層原理

2011-07-11 09:58:52

2020-10-27 10:43:24

Redis字符串數據庫

2014-04-15 11:19:19

2020-12-09 06:19:39

ReLU神經網絡深度學習

2015-04-21 17:35:29

代碼

2020-07-25 19:40:33

Java開發代碼

2025-03-18 09:20:00

Go語言Golang

2021-12-02 06:58:03

AIOps通信服務
點贊
收藏

51CTO技術棧公眾號

亚洲欧美一区二区三区在线| 久久精品一二三| 欧美激情中文字幕在线| 双性尿奴穿贞c带憋尿| 欧美va在线| 亚洲精品免费在线| 免费精品视频一区| 一级黄色片在线| 亚洲精品影院在线观看| 中文字幕精品视频| 97中文字幕在线观看| 日韩和的一区二在线| 一区二区三区中文字幕在线观看| 久久久水蜜桃| 国产v片在线观看| 日韩国产精品久久久| 九九久久综合网站| 少妇av片在线观看| 美女视频亚洲色图| 欧美一区二视频| 亚洲视频在线观看一区二区三区| 亚洲精品天堂| 中文字幕不卡三区| 欧美黑人3p| 亚洲精品无amm毛片| 日本亚洲视频在线| 欧美在线国产精品| 欧美色图亚洲天堂| 91麻豆国产自产在线观看亚洲| 亚洲国产精彩中文乱码av在线播放 | 久久久精品美女| 亚洲专区区免费| xvideos.蜜桃一区二区| 欧美人xxxx| 免费看国产黄色片| 欧美大胆性生话| 黄色精品在线看| 丁香婷婷综合激情| free性欧美hd另类精品| 国产精品久久久久久久午夜片 | 丁香六月天婷婷| 午夜影视一区二区三区| 红杏成人性视频免费看| 欧美日韩免费观看一区二区三区| 999一区二区三区| 国产a级片免费观看| 天天在线视频色| 日本一区二区在线不卡| 久久综合九九| 四虎影院在线播放| 不卡高清视频专区| 精品乱码一区二区三区| 可以免费观看的毛片| 国产成人在线视频网址| 92看片淫黄大片看国产片| 夜夜嗨aⅴ一区二区三区| 日本午夜一区二区| 国产精品成久久久久三级| 无码人妻精品一区二区50| 欧美专区18| 国产国语刺激对白av不卡| 亚洲 欧美 中文字幕| 日韩国产精品久久久久久亚洲| 日韩免费观看av| 日本一本在线观看| 日韩avvvv在线播放| 国产精品福利小视频| 怡春院在线视频| 久久成人av少妇免费| 成人免费福利视频| 亚洲产国偷v产偷v自拍涩爱| 国产成人午夜高潮毛片| 国产精品区一区二区三在线播放| 亚洲乱色熟女一区二区三区| 国产精品亚洲专一区二区三区| 99re在线国产| 色视频在线看| 中文字幕欧美三区| 无码人妻精品一区二区三区99v| jizz性欧美| 亚洲一区二区在线观看视频 | 国产免费a级片| 精品久久ai| 亚洲无限av看| 久久国产波多野结衣| 黄色成人av网站| 欧美主播福利视频| 中文字幕在线视频第一页| 国内精品伊人久久久久av影院| 51国产成人精品午夜福中文下载| 刘亦菲毛片一区二区三区| 久久亚洲一区二区三区四区| 亚洲自拍的二区三区| 92久久精品| 欧美日韩www| 少妇被狂c下部羞羞漫画| 精品国产欧美日韩| 色综合久久天天综线观看| 天堂а√在线中文在线新版| 蜜桃久久久久久久| 国产精品日韩一区二区| 国产乱视频在线观看| 一区二区不卡在线播放| 国产aaa一级片| 国产一区一区| 亚洲欧美一区二区精品久久久 | 亚洲国产色一区| 中文字幕欧美人妻精品一区| 久久在线观看| 国产一区二区三区中文| 国产精品成人免费一区二区视频| 日本怡春院一区二区| 国产欧美韩日| 毛片av在线| 色综合咪咪久久| 波多野结衣办公室双飞| 欧美韩日高清| 国产盗摄xxxx视频xxx69| 日韩专区第一页| 亚洲欧美激情在线| 亚洲娇小娇小娇小| 九九视频免费观看视频精品| 精品中文字幕在线观看| 亚洲一级特黄毛片| 久久这里只有精品6| 波多野结衣av一区二区全免费观看| 欧美黄色三级| 国产视频精品久久久| 久久免费看少妇高潮v片特黄| 天堂蜜桃一区二区三区| 久久av免费观看| 国精一区二区三区| 日韩欧美一级二级三级| 性生交大片免费全黄| 日韩电影在线观看电影| 欧美一区二区三区成人久久片| 成人性生交大片免费看网站| 日韩一区国产二区欧美三区| 最新日韩免费视频| 免费xxxx性欧美18vr| 欧美专区一二三 | 在线国产一区二区| 国产色视频一区| 3p视频在线观看| 欧日韩精品视频| 熟女少妇内射日韩亚洲| 欧美亚洲免费| 日韩福利视频| 久久野战av| 影音先锋欧美精品| 最近国语视频在线观看免费播放| 久久免费午夜影院| 亚洲国产精品毛片av不卡在线| 亚洲精品亚洲人成在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 日韩专区第一页| 欧美性高潮在线| av黄色在线免费观看| 日本在线不卡一区| 五月天男人天堂| 久久久久久亚洲精品美女| 欧美高清自拍一区| 天天操天天操天天| 色婷婷久久综合| 美国精品一区二区| 国产精品一区二区三区四区| 白白操在线视频| 免费萌白酱国产一区二区三区| 97精品久久久| 久青草国产在线| 欧美日韩免费观看一区三区| 在线观看亚洲网站| 成人91在线观看| 黄色片一级视频| 久久中文字幕av| 国产精选在线观看91| 伊人成综合网站| 色诱女教师一区二区三区| 国产欧美一级片| 亚洲电影第三页| 无码人妻丰满熟妇啪啪欧美| 精品一二三四在线| 欧日韩免费视频| 黑丝美女一区二区| 91香蕉视频在线下载| av毛片午夜不卡高**水| 在线看国产精品| 亚洲欧美国产高清va在线播放| 欧美日韩亚洲精品一区二区三区 | 91成人网在线| 人妻互换一区二区激情偷拍| 国产一区二区三区日韩| 国产v片免费观看| 国产真实有声精品录音| 91在线精品视频| 蜜桃麻豆av在线| 日韩中文字幕国产| 欧美一级特黄aaaaaa| 欧美在线啊v一区| 久久久精品国产sm调教网站| 久久久久久电影| 777一区二区| 中文精品视频| 波多野结衣三级在线| 欧美在线关看| 亚洲a一级视频| 国模套图日韩精品一区二区| 日韩中文第一页| 色视频免费在线观看| 7777精品伊人久久久大香线蕉最新版| 亚洲国产精品午夜在线观看| 国产精品你懂的在线| 国产艳妇疯狂做爰视频| 人人精品人人爱| 国产原创popny丨九色| 亚洲电影影音先锋| 四虎一区二区| 色先锋久久影院av| 国产成人精品福利一区二区三区| 不卡亚洲精品| 日韩美女av在线免费观看| 肉肉视频在线观看| 久久午夜a级毛片| 国产精品秘入口| 日韩精品一区二区视频| 亚洲国产欧美另类| 欧美一级高清大全免费观看| 黄色av一区二区| 福利微拍一区二区| 人人干人人干人人干| 亚洲黄一区二区三区| 久草福利资源在线| 国产日韩欧美综合在线| 国产三级国产精品| 成人免费高清在线| 国产a√精品区二区三区四区| 精品亚洲国内自在自线福利| 亚洲最大综合网| 欧美专区在线| 免费裸体美女网站| 国产日韩综合| 精品一区二区中文字幕| 在线精品福利| 久久综合色视频| 亚洲理论在线| 97成人在线免费视频| 亚洲国产精品第一区二区| a天堂资源在线观看| 好看的日韩av电影| 欧美黑人在线观看| 亚洲二区视频| 欧美一区二区三区爽大粗免费| 在线免费高清一区二区三区| av女优在线播放| 一区二区激情| 免费在线激情视频| 噜噜噜在线观看免费视频日韩| heyzo国产| 久久成人亚洲| 乌克兰美女av| 麻豆成人久久精品二区三区小说| 我要看一级黄色大片| 精品一区二区三区视频在线观看| 不卡中文字幕在线观看| 国产一区二区视频在线| 爱情岛论坛亚洲自拍| 丁香六月久久综合狠狠色| 在线视频 日韩| 91农村精品一区二区在线| 国产人妻大战黑人20p| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美最新另类人妖| 一区二区精品视频| 欧美精品日本| 久久久999免费视频| 日本中文字幕一区| 激情成人在线观看| 91一区一区三区| 亚洲一级理论片| 亚洲一区中文日韩| 亚洲成熟少妇视频在线观看| 欧美吻胸吃奶大尺度电影| 国产精品无码白浆高潮| 亚洲第一免费网站| yjizz视频网站在线播放| 久久国产精品久久久久久久久久| 91吃瓜在线观看| 国产精品极品尤物在线观看 | 狠狠久久综合婷婷不卡| 国产成人1区| 无码人妻aⅴ一区二区三区日本| 亚洲精品韩国| www.夜夜爽| youjizz久久| 国产精品一区二区亚洲| 亚洲电影一级黄| 一级片视频免费| 日韩乱码在线视频| www.久久ai| 国产成人精品一区二区| 日韩精品久久久久久久软件91| 久久综合狠狠综合久久综青草 | 黄色一级视频在线播放| 全国精品久久少妇| 麻豆tv在线观看| 欧美激情一区三区| 日本学生初尝黑人巨免费视频| 91黄色免费观看| 免费的黄色av| 久色乳综合思思在线视频| 三妻四妾完整版在线观看电视剧| 91精品国产自产在线老师啪| 小嫩嫩12欧美| 日韩成人三级视频| 久久精品国产久精国产| 亚洲永久精品ww.7491进入| 亚洲精品免费一二三区| 中文字幕无线码一区| 日韩精品中文字幕久久臀| 免费毛片在线看片免费丝瓜视频| 国产精品麻豆va在线播放| 欧美中文一区| 亚洲理论电影在线观看| 久88久久88久久久| 非洲一级黄色片| 日韩欧美在线视频| 日本毛片在线观看| 欧美高清在线播放| 欧美国产中文高清| 中文字幕av日韩精品| 青青草成人在线观看| 97伦伦午夜电影理伦片| 亚洲成国产人片在线观看| 国产极品999| 北条麻妃在线一区二区| 欧美国产日韩电影| 视频一区国产精品| 久久久久国产一区二区| 欧美丰满少妇人妻精品| 亚洲va韩国va欧美va| 亚洲AV无码成人片在线观看| 久久精品最新地址| 91麻豆精品国产91久久久更新资源速度超快| 欧美资源一区| 日韩电影在线免费看| 亚洲一二三精品| 欧美午夜片在线观看| 国产专区在线| 国产精品久久久av| 成人影视亚洲图片在线| 牛夜精品久久久久久久| 国产精品久久久久久久裸模| 在线免费观看国产精品| 国产一区二区免费| 成人福利片在线| 中文字幕一区二区三区四区五区| 日本伊人午夜精品| 99鲁鲁精品一区二区三区| 91精品国产综合久久久久久久久久 | 国产成人亚洲综合a∨婷婷图片| 91视频综合网| 精品成a人在线观看| 理论不卡电影大全神| 欧美精品一区在线发布| 久久一区二区三区超碰国产精品| 亚洲激情视频小说| 精品视频免费在线| dy888亚洲精品一区二区三区| 91综合免费在线| 国产欧美精品| 受虐m奴xxx在线观看| 欧美日韩一区久久| 动漫一区在线| 国产欧美一区二区视频| 国产麻豆综合| 正在播放国产对白害羞| 日韩午夜精品电影| 特黄毛片在线观看| 亚洲ai欧洲av| 国产不卡在线一区| 日本午夜视频在线观看| 在线日韩中文字幕| 999久久精品| 国产淫片av片久久久久久| 国产精品系列在线| 亚洲国产999| 国产精品va在线播放| 亚洲综合中文| 极品人妻一区二区三区| 欧美人与禽zozo性伦| 99在线视频影院| 天堂一区二区三区| 国产一区二区三区久久悠悠色av| 国产精品50页| 一二美女精品欧洲| 国产精品白丝av嫩草影院| 少妇黄色一级片| 亚洲国产精品一区二区www在线| 麻豆国产在线播放| 99中文字幕|