iOS開發 ----- 網絡請求

網絡請求

請求網絡數據,常見有兩種方式

  1. 同步
  2. 異步

在iOS8中已經棄用了NSURLConnection,而啓用NSURLSession,同時在iOS9中啓用了https加密,所以和以往的方式不僅相同,下邊做些整理

同步請求 1

//通過一個網址直接拿到數據,然後JSON解析即可,這種屬於同步請求,阻塞主線程,影響執行效率

    NSData * data = [NSData dataWithContentsOfURL:url];

    NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@",dict);

同步請求 2


//利用 NSURLConnection 發起同步請求,同樣也會阻塞主線程,影響執行效率
    NSURLRequest * request = [NSURLRequest requestWithURL:url];


    NSError * error = nil;
    NSURLResponse * response = nil;

    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

異步請求 1

//利用 NSURLConnection 發起異步請求,但由於在iOS8之後蘋果已經廢棄該類,所以,這樣做並不好

    NSURLRequest * request = [NSURLRequest requestWithURL:url];

    //queue 線程
    //發送異步請求,
    //handler 請求完成之後的處理
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //response  響應
        //data      請求過來的數據
        //error     錯誤信息

        //解析數據,存儲模型
        NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"%@",dict);


    }];

異步請求 2

//另一種形式利用 NSURLConnection發起異步請求,需要遵守 NSURLConnectionDataDelegate 協議
NSURLRequest * request = [NSURLRequest requestWithURL:url];

    NSURLConnection * connection = [NSURLConnection connectionWithRequest:request delegate:self];

異步請求 2 代理方法

_代理1____收到服務器響應

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{




    NSLog(@"收到響應");
}
_代理2____收到數據
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

    NSLog(@"追加數據");
    [_data appendData:data];

}
_代理3____數據傳輸完成
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@",dict);


    NSLog(@"完成加載,開始分析數據");
}
_代理4____數據傳輸錯誤
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"加載出錯");
}

異步請求 3 —> GET請求

//利用NSURLSession發起網絡請求,異步加載,蘋果推薦的一種方式,默認是GET請求,block在請求完成之後調用

    NSURLRequest * reuqest = [NSURLRequest requestWithURL:url];


    NSURLSession * session = [NSURLSession sharedSession];

    //管理請求任務 網絡鏈接
    NSURLSessionDataTask * task = [session dataTaskWithRequest:reuqest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {


        if (!error) {
            NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
            NSLog(@"%@",dict);

        }else
        {
            NSLog(@"%@",error);
        }

    }];

    // 啓動任務  啓動下載
    [task resume];

異步請求 4 —> POST請求

//異步請求,要把POST的內容放入 HTTPBody 中,由於POST的數據是加密的,所以推薦這種方式
//所謂的GET POST 和HTML中表單提交的方式是類似的,GET的時候,可在地址欄看見提交的數據,而POST的時候,是不可見的

    NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:url];

    //設置請求的方式
    //不寫的話,默認是get
    request.HTTPMethod = @"POST";

    //不能直接拼參數,把參數寫到HTTP 的 body裏邊區
    NSString * str = @"number=10&page=2";

    //把參數放大請求的body裏邊
    request.HTTPBody = [str dataUsingEncoding:NSUTF8StringEncoding];

    NSURLSession * section = [NSURLSession sharedSession];

    NSURLSessionTask * task = [section dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {


        NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSLog(@"%@",dict);

    }];
    [task resume];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章