NSURLSession学习笔记Session Task

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSURLSession学习笔记Session Task相关的知识,希望对你有一定的参考价值。


Session Task分为三种Data Task,Upload Task,Download Task。毫无疑问,Session Task是整个NSURLSession架构的核心目标。

下面写了一个简单的Demo来初步使用下三种任务对象。这里使用的是convenience methods,并没有定制session和使用协议,都是采用completionHandler作为回调动作。

故事板内容为:

NSURLSession学习笔记(二)Session


第一种Data Task用于加载数据,使用全局的shared session和dataTaskWithRequest:completionHandler:方法创建。代码如下:

​​


1. /* 使用NSURLSessionDataTask加载网页数据 */  
2. - (IBAction)loadData:(id)sender
3. // 开始加载数据,让spinner转起来
4. self.spinner startAnimating];
5.
6. // 创建Data Task,用于打开我的blog主页
7. NSURL *url = [NSURL URLWithString
8. NSURLRequest *request = [NSURLRequest requestWithURL:url];
9. NSURLSession *session = [NSURLSession sharedSession];
10. NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
11. completionHandler:
12. NSData *data, NSURLResponse *response, NSError *error)
13. // 输出返回的状态码,请求成功的话为200
14. self showResponseCode:response];
15.
16. // 在webView中加载数据
17. self.webView loadData:data
18. MIMEType:@"text/html"
19. textEncodingName:@"utf-8"
20. baseURL:nil];
21.
22. // 加载数据完毕,停止spinner
23. self.spinner stopAnimating];
24. ];
25. // 使用resume方法启动任务
26. resume];
27.
28.
29. /* 输出http响应的状态码 */
30. - (void)showResponseCode:(NSURLResponse *)response
31. NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
32. statusCode];
33. @"%d", responseStatusCode);
34.


completionHandler指定任务完成后的动作。注意一定要使用resume方法启动任务。(Upload Task和Download Task同理)

运行结果:

NSURLSession学习笔记(二)Session


第二种Upload Task用于完成上传文件任务,使用方法类似:



​​



    1. /* 使用NSURLSessionUploadTask上传文件 */  
    2. - (IBAction)uploadFile:(id)sender
    3. // NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
    4. // NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    5. // NSData *data = ...;
    6. //
    7. // NSURLSession *session = [NSURLSession sharedSession];
    8. // NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request
    9. // fromData:data
    10. // completionHandler:
    11. // ^(NSData *data, NSURLResponse *response, NSError *error)
    12. // // ...
    13. // ];
    14. //
    15. // [uploadTask resume];
    16.




    第三种Download Task用于完成下载文件的任务,使用全局的shared session和downloadTaskWithRequest:completionHandler:方法创建。

    注意:在下载任务完成后,下载的文件位于tmp目录下,由代码块中的location指定(不妨输出看看),我们必须要在completion handler中将文件放到持久化的目录下保存。代码如下:



    ​​


    1. /* 使用NSURLSessionDownloadTask下载文件 */  
    2. - (IBAction)downloadFile:(id)sender
    3. self.spinner startAnimating];
    4.
    5. NSURL *URL = [NSURL URLWithString:@"http://b.hiphotos.baidu.com/image/w%3D2048/sign=6be5fc5f718da9774e2f812b8469f919/8b13632762d0f703b0faaab00afa513d2697c515.jpg"];
    6. NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    7. NSURLSession *session = [NSURLSession sharedSession];
    8. NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request
    9. completionHandler:
    10. NSURL *location, NSURLResponse *response, NSError *error)
    11. self showResponseCode:response];
    12.
    13. // 输出下载文件原来的存放目录
    14. @"%@", location);
    15.
    16. // 设置文件的存放目标路径
    17. NSString *documentsPath = [self getDocumentsPath];
    18. NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];
    19. NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:[[response URL] lastPathComponent]];
    20.
    21. // 如果该路径下文件已经存在,就要先将其移除,在移动文件
    22. NSFileManager *fileManager = [NSFileManager defaultManager];
    23. if ([fileManager fileExistsAtPath:[fileURL path] isDirectory:NULL])
    24. removeItemAtURL:fileURL error:NULL];
    25.
    26. moveItemAtURL:location toURL:fileURL error:NULL];
    27.
    28. // 在webView中加载图片文件
    29. NSURLRequest *showImage_request = [NSURLRequest requestWithURL:fileURL];
    30. self.webView loadRequest:showImage_request];
    31.
    32. self.spinner stopAnimating];
    33. ];
    34.
    35. resume];
    36.
    37.
    38. /* 获取Documents文件夹的路径 */
    39. - (NSString *)getDocumentsPath
    40. NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    41. NSString *documentsPath = documents[0];
    42. return documentsPath;
    43.


    运行结果:


    NSURLSession学习笔记(二)Session



    这个Demo中没有为NSURLSession指定session的delegate,所以没有使用委托中的方法,功能比较有限,而且也没有自行定制session的配置,所以只能执行简单的任务,但是对于加载数据,下载一张图片等任务已经可以应付自如。对于创建后台下载任务,支持断点续传的下载任务等将在下一篇文章中分析介绍。

    以上是关于NSURLSession学习笔记Session Task的主要内容,如果未能解决你的问题,请参考以下文章

    iOS学习笔记13-网络NSURLSession

    NSURLSession学习笔记简介

    iOS学习笔记21-NSUrlSession与NSUrlConnection

    NSURLSession学习笔记简介

    NSURLSession下载文件-代理

    iOS开发之网络编程--1NSURLSession的基本使用