网路下载使用 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的框架。