網(wǎng)絡01

網(wǎng)絡基礎

  • Http:
  • 蘋果原生:
  • NSURLConnection 03年推出的古老技術
  • NSURLSession 14年推出屯碴,為了代替NSURLConnection
  • CFNetwork c語言的嗜暴,底層的
  • 第三方框架:
    • AFNetworking
  • NSURLConnection基本使用:
    • NSURLConnection同步請求(GET)
    • 發(fā)送網(wǎng)絡請求的步驟
      • 確定url
      • 創(chuàng)建請求
      • 發(fā)送NSURLSession sendsync同步請求
      • 服務器得到消息后解析內(nèi)容
    • 相關代碼:
         //1.確定請求路徑
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
        //NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
      
        //2.創(chuàng)建一個請求對象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
      
        //3.把請求發(fā)送給服務器
        //sendSynchronousRequest  阻塞式的方法,會卡住線程
      
        NSHTTPURLResponse *response = nil;
        NSError *error = nil;
      
        /*
        第一個參數(shù):請求對象
        第二個參數(shù):響應頭信息排惨,當該方法執(zhí)行完畢之后,該參數(shù)被賦值
        第三個參數(shù):錯誤信息,如果請求失敗吉拳,則error有值
        */
        //該方法是阻塞式的,會卡住線程
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
      
        //4.解析服務器返回的數(shù)據(jù)
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
      
  • NSURLConnection異步請求(GET-SendAsync)
    • 相關說明:該請求是異步的适揉,不會卡在當前線程
  • 相關代碼:
      //1.確定請求路徑
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it"];
    
        //2.創(chuàng)建一個請求對象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        //3.把請求發(fā)送給服務器,發(fā)送一個異步請求
        /*
        第一個參數(shù):請求對象
        第二個參數(shù):回調方法在哪個線程中執(zhí)行留攒,如果是主隊列則block在主線程中執(zhí)行,非主隊列則在子線程中執(zhí)行
        第三個參數(shù):completionHandlerBlock塊:接受到響應的時候執(zhí)行該block中的代碼
                response:響應頭信息
                data:響應體
                connectionError:錯誤信息嫉嘀,如果請求失敗炼邀,那么該參數(shù)有值
             */
        [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
    
        //4.解析服務器返回的數(shù)據(jù)
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            //轉換并打印響應頭信息
            NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
            NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
        }];
    
  • NSURLConnection異步請求(代理)
  • 步驟:
    • 確定url路徑
    • 創(chuàng)建request請求對象
    • 創(chuàng)建NSURLConnection對象,并設置代理
    • 遵守NSURLConnectionDelegate協(xié)議剪侮,并實現(xiàn)代理方法 - 在代理方法中監(jiān)聽網(wǎng)絡請求
  • 設置代理的幾種方法:
      /*
      設置代理的第一種方式:自動發(fā)送網(wǎng)絡請求
      [[NSURLConnection alloc]initWithRequest:request delegate:self];
      */
    
     /*
      設置代理的第二種方式:
      第一個參數(shù):請求對象
      第二個參數(shù):誰成為NSURLConnetion對象的代理
      第三個參數(shù):是否馬上發(fā)送網(wǎng)絡請求拭宁,如果該值為YES則立刻發(fā)送,如果為NO則不會發(fā)送網(wǎng)路請求
      NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
    
      //調用該方法控制網(wǎng)絡請求的發(fā)送
      [conn start];
      */
    
     //設置代理的第三種方式:使用類方法設置代理票彪,會自動發(fā)送網(wǎng)絡請求
     NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
     //取消網(wǎng)絡請求
     //[conn cancel];
    
  • 相關代理方法:
  /*
      1.當接收到服務器響應的時候調用
      第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
      第二個參數(shù)response:接收到的服務器返回的響應頭信息
      */
     - (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response

     /*
      2.當接收到數(shù)據(jù)的時候調用红淡,該方法會被調用多次
      第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
      第二個參數(shù)data:本次接收到的服務端返回的二進制數(shù)據(jù)(可能是片段)
      */
     - (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
     /*

      3.當服務端返回的數(shù)據(jù)接收完畢之后會調用
      通常在該方法中解析服務器返回的數(shù)據(jù)
      */
     -(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection

     /*4.當請求錯誤的時候調用(比如請求超時)
      第一個參數(shù)connection:NSURLConnection對象
      第二個參數(shù):網(wǎng)絡請求的錯誤信息,如果請求失敗降铸,則error有值
      */
     - (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error

  • 其它知識點
    • 關于消息彈窗第三方框架的使用
      SVProgressHUD
    • 字符串截取相關方法
       - (NSRange)rangeOfString:(NSString *)searchString;
       - (NSString *)substringWithRange:(NSRange)range;
    
  • NSURLConnection發(fā)送POST請求
    • 發(fā)送POST請求對象方法
    • 確定請求路徑
    • 創(chuàng)建可變請求對象
    • 修改請求方法為POST在旱,設置請求體(data)
    • 發(fā)送異步請求
    • 相關代碼
      //1.確定請求路徑
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
    
        //2.創(chuàng)建請求對象
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
        //2.1更改請求方法
        request.HTTPMethod = @"POST";
    
        //2.2設置請求體
        request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];
    
        //2.3請求超時
        request.timeoutInterval = 5;
    
        //2.4設置請求頭
        [request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];
    
        //3.發(fā)送請求
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
    
            //4.解析服務器返回的數(shù)據(jù)
            if (connectionError) {
                NSLog(@"--請求失敗-");
            }else
            {
                NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
            }
        }];
    
  • url中文轉碼問題:
      //1.確定請求路徑
    NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小碼哥&pwd=520it";
    NSLog(@"%@",urlStr);
    //中文轉碼操作
    urlStr =  [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"%@",urlStr);
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
  • NSURLConnection和RunLoop(面試)
    • 兩種為NSURLConnection設置代理的區(qū)別
      //第一種設置方式:
    //通過該方法設置代理,會自動的發(fā)送請求
    // [[NSURLConnection alloc]initWithRequest:request delegate:self];
    
    //第二種設置方式:
    //設置代理推掸,startImmediately為NO的時候桶蝎,該方法不會自動發(fā)送請求
    NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
    //手動通過代碼的方式來發(fā)送請求
    //注意該方法內(nèi)部會自動的把connect添加到當前線程的RunLoop中在默認模式下執(zhí)行
    [connect start];
    
    • 如何控制代理方法在哪個線程調用
      //說明:默認情況下,代理方法會在主線程中進行調用(為了方便開發(fā)者拿到數(shù)據(jù)后處理一些刷新UI的操作不需要考慮到線程間通信)
    //設置代理方法的執(zhí)行隊列
    [connect setDelegateQueue:[[NSOperationQueue alloc]init]];
    
    • 開子線程發(fā)送網(wǎng)絡請求的注意點,適用于自動發(fā)送網(wǎng)絡請求:
      //在子線程中發(fā)送網(wǎng)絡請求-調用startf方法發(fā)送
    -(void)createNewThreadSendConnect1
    {
        //1.創(chuàng)建一個非主隊列
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
        //2.封裝操作谅畅,并把任務添加到隊列中執(zhí)行
        [queue addOperationWithBlock:^{
    
            NSLog(@"%@",[NSThread currentThread]);
            //2-1.確定請求路徑
            NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
            //2-2.創(chuàng)建請求對象
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
            //2-3.使用NSURLConnection設置代理登渣,發(fā)送網(wǎng)絡請求
            NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
    
            //2-4.設置代理方法在哪個隊列中執(zhí)行,如果是非主隊列毡泻,那么代理方法將再子線程中執(zhí)行
            [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
            //2-5.發(fā)送網(wǎng)絡請求
            //注意:start方法內(nèi)部會把當前的connect對象作為一個source添加到當前線程對應的runloop中
            //區(qū)別在于胜茧,如果調用start方法開發(fā)送網(wǎng)絡請求,那么再添加source的過程中仇味,如果當前runloop不存在
            //那么該方法內(nèi)部會自動創(chuàng)建一個當前線程對應的runloop,并啟動呻顽。
            [connection start];
    
        }];
    }
    
    //在子線程中發(fā)送網(wǎng)絡請求-自動發(fā)送網(wǎng)絡請求
    -(void)createNewThreadSendConnect2
    {
        NSLog(@"-----");
        //1.創(chuàng)建一個非主隊列
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
        //2.封裝操作,并把任務添加到隊列中執(zhí)行
        [queue addOperationWithBlock:^{
    
            //2-1.確定請求路徑
            NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
            //2-2.創(chuàng)建請求對象
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
            //2-3.使用NSURLConnection設置代理丹墨,發(fā)送網(wǎng)絡請求
            //注意:該方法內(nèi)部雖然會把connection添加到runloop,但是如果當前的runloop不存在廊遍,那么不會主動創(chuàng)建。
            NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    
            //2-4.設置代理方法在哪個隊列中執(zhí)行贩挣,如果是非主隊列喉前,那么代理方法將再子線程中執(zhí)行
            [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
            //2-5 創(chuàng)建當前線程對應的runloop,并開啟
           [[NSRunLoop currentRunLoop]run];
        }];
    }
    
  • NSURLSession的基本使用
      //在子線程中發(fā)送網(wǎng)絡請求-調用startf方法發(fā)送
      -(void)createNewThreadSendConnect1
      {
          //1.創(chuàng)建一個非主隊列
          NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
          //2.封裝操作没酣,并把任務添加到隊列中執(zhí)行
          [queue addOperationWithBlock:^{
    
              NSLog(@"%@",[NSThread currentThread]);
              //2-1.確定請求路徑
              NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
              //2-2.創(chuàng)建請求對象
              NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
              //2-3.使用NSURLConnection設置代理,發(fā)送網(wǎng)絡請求
              NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
    
              //2-4.設置代理方法在哪個隊列中執(zhí)行卵迂,如果是非主隊列裕便,那么代理方法將再子線程中執(zhí)行
              [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
              //2-5.發(fā)送網(wǎng)絡請求
              //注意:start方法內(nèi)部會把當前的connect對象作為一個source添加到當前線程對應的runloop中
              //區(qū)別在于,如果調用start方法開發(fā)送網(wǎng)絡請求狭握,那么再添加source的過程中闪金,如果當前runloop不存在
              //那么該方法內(nèi)部會自動創(chuàng)建一個當前線程對應的runloop,并啟動疯溺。
              [connection start];
    
          }];
      }
    
      //在子線程中發(fā)送網(wǎng)絡請求-自動發(fā)送網(wǎng)絡請求
      -(void)createNewThreadSendConnect2
      {
          NSLog(@"-----");
          //1.創(chuàng)建一個非主隊列
          NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
          //2.封裝操作论颅,并把任務添加到隊列中執(zhí)行
          [queue addOperationWithBlock:^{
    
              //2-1.確定請求路徑
              NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
              //2-2.創(chuàng)建請求對象
              NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
              //2-3.使用NSURLConnection設置代理,發(fā)送網(wǎng)絡請求
              //注意:該方法內(nèi)部雖然會把connection添加到runloop,但是如果當前的runloop不存在囱嫩,那么不會主動創(chuàng)建恃疯。
              NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    
              //2-4.設置代理方法在哪個隊列中執(zhí)行,如果是非主隊列墨闲,那么代理方法將再子線程中執(zhí)行
              [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
              //2-5 創(chuàng)建當前線程對應的runloop,并開啟
             [[NSRunLoop currentRunLoop]run];
          }];
      }
    
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末今妄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸳碧,更是在濱河造成了極大的恐慌盾鳞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞻离,死亡現(xiàn)場離奇詭異腾仅,居然都是意外死亡,警方通過查閱死者的電腦和手機套利,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門推励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肉迫,你說我怎么就攤上這事验辞。” “怎么了喊衫?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵跌造,是天一觀的道長。 經(jīng)常有香客問我族购,道長壳贪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任联四,我火速辦了婚禮撑碴,結果婚禮上,老公的妹妹穿的比我還像新娘朝墩。我一直安慰自己醉拓,他們只是感情好伟姐,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亿卤,像睡著了一般愤兵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上排吴,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天秆乳,我揣著相機與錄音,去河邊找鬼钻哩。 笑死屹堰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的街氢。 我是一名探鬼主播扯键,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼珊肃!你這毒婦竟也來了荣刑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤伦乔,失蹤者是張志新(化名)和其女友劉穎厉亏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烈和,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡爱只,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斥杜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虱颗。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔗喂,靈堂內(nèi)的尸體忽然破棺而出忘渔,到底是詐尸還是另有隱情,我是刑警寧澤缰儿,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布畦粮,位于F島的核電站,受9級特大地震影響乖阵,放射性物質發(fā)生泄漏宣赔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一瞪浸、第九天 我趴在偏房一處隱蔽的房頂上張望儒将。 院中可真熱鬧,春花似錦对蒲、人聲如沸钩蚊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砰逻。三九已至鸣驱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝠咆,已是汗流浹背踊东。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刚操,地道東北人闸翅。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像赡茸,于是被迫代替她去往敵國和親缎脾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容