網路下載使用 NSURLSession (1)

網路下載使用 NSURLSession (1)

WWDC 2013,Apple提供接替NSURLConnection的框架:NSURLSession,它提供Session的架構,讓你可以利用NSURLSessionTask來增加你要下載或是上傳的程序,下載方面還提供續傳功能,也就是你可以暫時你的Task再回復Task,另外也提供 背景下載 功能,在NSURLSession架構中也提供初始化的設定,這些設定方式由NSURLSessionConfiguration來管理,如果你要提供背景下載就需要更改其中的設定才能完成,在此之前先看一下它提供的架構:

圖中看到NSURLSession掌控著NSURLSessionTask,一個NSURLSession可以有很多的Task,其中Task也有2種類型供使用,架構看起來點有覆雜,不過實際使用上已經將很多細節都由框架處理完成。 NSURLSession有提供Block的方式在事件成功後回傳至Block或是使用Delegate方式掌握更多的網路動作,比如:下載進度、下載完成…等,這些後續再慢慢增加內容來介紹,這章先介紹使用Block方式與NSURLConnection比較。

首先,我在Gist上建立一個很簡單的JSON內容:

{
  "date":"2014/01/02"
}

網址是:

https://gist.githubusercontent.com/anonymous/11133825/raw/1dcc30f34adeb00b2b7cdb419a8ee2729f9237b4/gistfile1.json

後續要以NSURLConnectionNSURLSession兩種方式做比較:

  • NSURLConnection

NSURLConnection需要先建立NSURLRequest,再將Request傳入NSURLConnection,

//-----------start-----------
    NSURLRequest *request = [NSURLRequest requestWithURL:
                             [NSURL URLWithString:@"https://gist.githubusercontent.com/anonymous/11133825/raw/1dcc30f34adeb00b2b7cdb419a8ee2729f9237b4/gistfile1.json"]];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@", json);

    }];
//------------end------------

輸出結果:

NSURLSessionDemo[44877:60b] {
  "date":"2014/01/02"
}

  • NSURLSession

現在要利用NSURLSession的Block方式下載並且用NSLog印出內容:

//-----------start-----------
NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://gist.githubusercontent.com/anonymous/11133825/raw/1dcc30f34adeb00b2b7cdb419a8ee2729f9237b4/gistfile1.json"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@", json);
    }];
//
 [dataTask resume];
//------------end------------

輸出結果:

NSURLSessionDemo[44561:1303] {
    date = "2014/01/02";
}

NSURLConnection例子中當你執行sendAsynchronousRequest:request,你的下載動作就已經發生,然而NSURLSession整個過程必需要執行[dataTask resume]才會開始下載,如果你的下載動作與資料量並非大到需要提供進度表示或續傳功能時,這2種的功能其實是差不多的,這章節先用最簡單的方式進入NSURLSession的框架。