NSURLSession VS NSURLConnection_nsurlconnection vs nsurlsession-程序员宅基地

技术标签: iOS 开发  

NSURLSession VS NSURLConnection  
NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有: 

  • * 根据每个Session做配置(http header,Cache,Cookie,protocal,Credential),不再在整个App层面共享配置.
  • * 支持网络操作的取消和断点续传
  • * 改进了授权机制的处理
  • * 丰富的Delegate模型
  • * 分离了真实数据和网络配置数据。
  • * 后台处理上传和下载,即使你点击了“Home”按钮,后台仍然可以继续下载,并且提供了根据网络状况,电力情况进行处理的配置。

知识点  



用法  
使用NSURLSession的一般套路如下: 
  • 1. 定义一个NSURLRequest
  • 2. 定义一个NSURLSessionConfiguration,配置各种网络参数
  • 3. 使用NSURLSession的工厂方法获取一个所需类型的NSURLSession
  • 4. 使用定义好的NSURLRequest和NSURLSession构建一个NSURLSessionTask
  • 5. 使用Delegate或者CompletionHandler处理任务执行过程的所有事件。

实战  
这儿我简单的实现了一个下载任务的断点续传功能,具体效果如下: 

 

实现代码如下: 
Object-c代码   收藏代码
  1. #import "UrlSessionDemoViewController.h"  
  2.   
  3. @interface UrlSessionDemoViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation UrlSessionDemoViewController  
  8.   
  9. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  10. {  
  11.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  12.     return self;  
  13. }  
  14.   
  15. - (void)viewDidLoad  
  16. {  
  17.     [super viewDidLoad];  
  18.     self.progressBar.progress = 0;  
  19. }  
  20.   
  21.   
  22. - (NSURLSession *)session  
  23. {  
  24.     //创建NSURLSession  
  25.     NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];  
  26.     NSURLSession  *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];  
  27.     return session;  
  28. }  
  29.   
  30. - (NSURLRequest *)request  
  31. {  
  32.     //创建请求  
  33.     NSURL *url = [NSURL URLWithString:@"http://p1.pichost.me/i/40/1639665.png"];  
  34.     NSURLRequest *request = [NSURLRequest requestWithURL:url];  
  35.     return request;  
  36. }  
  37.   
  38. -(IBAction)start:(id)sender  
  39. {  
  40.     //用NSURLSession和NSURLRequest创建网络任务  
  41.     self.task = [[self session] downloadTaskWithRequest:[self request]];  
  42.     [self.task resume];  
  43. }  
  44.   
  45. -(IBAction)pause:(id)sender  
  46. {  
  47.     NSLog(@"Pause download task");  
  48.     if (self.task) {  
  49.         //取消下载任务,把已下载数据存起来  
  50.         [self.task cancelByProducingResumeData:^(NSData *resumeData) {  
  51.             self.partialData = resumeData;  
  52.             self.task = nil;  
  53.         }];  
  54.     }  
  55. }  
  56.   
  57. -(IBAction)resume:(id)sender  
  58. {  
  59.     NSLog(@"resume download task");  
  60.     if (!self.task) {  
  61.         //判断是否又已下载数据,有的话就断点续传,没有就完全重新下载  
  62.         if (self.partialData) {  
  63.             self.task = [[self session] downloadTaskWithResumeData:self.partialData];  
  64.         }else{  
  65.             self.task = [[self session] downloadTaskWithRequest:[self request]];  
  66.         }  
  67.     }  
  68.     [self.task resume];  
  69. }  
  70.   
  71. //创建文件本地保存目录  
  72. -(NSURL *)createDirectoryForDownloadItemFromURL:(NSURL *)location  
  73. {  
  74.     NSFileManager *fileManager = [NSFileManager defaultManager];  
  75.     NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];  
  76.     NSURL *documentsDirectory = urls[0];  
  77.     return [documentsDirectory URLByAppendingPathComponent:[location lastPathComponent]];  
  78. }  
  79. //把文件拷贝到指定路径  
  80. -(BOOL) copyTempFileAtURL:(NSURL *)location toDestination:(NSURL *)destination  
  81. {  
  82.   
  83.     NSError *error;  
  84.     NSFileManager *fileManager = [NSFileManager defaultManager];  
  85.     [fileManager removeItemAtURL:destination error:NULL];  
  86.     [fileManager copyItemAtURL:location toURL:destination error:&error];  
  87.     if (error == nil) {  
  88.         return true;  
  89.     }else{  
  90.         NSLog(@"%@",error);  
  91.         return false;  
  92.     }  
  93. }  
  94.   
  95. #pragma mark NSURLSessionDownloadDelegate  
  96. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask  
  97. didFinishDownloadingToURL:(NSURL *)location  
  98. {  
  99.     //下载成功后,文件是保存在一个临时目录的,需要开发者自己考到放置该文件的目录  
  100.     NSLog(@"Download success for URL: %@",location.description);  
  101.     NSURL *destination = [self createDirectoryForDownloadItemFromURL:location];  
  102.     BOOL success = [self copyTempFileAtURL:location toDestination:destination];  
  103.       
  104.     if(success){  
  105. //        文件保存成功后,使用GCD调用主线程把图片文件显示在UIImageView中  
  106.         dispatch_async(dispatch_get_main_queue(), ^{  
  107.             UIImage *image = [UIImage imageWithContentsOfFile:[destination path]];  
  108.             self.imageView.image = image;  
  109.             self.imageView.contentMode = UIViewContentModeScaleAspectFit;  
  110.             self.imageView.hidden = NO;  
  111.         });  
  112.     }else{  
  113.         NSLog(@"Meet error when copy file");  
  114.     }  
  115.     self.task = nil;  
  116. }  
  117.   
  118. /* Sent periodically to notify the delegate of download progress. */  
  119. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask  
  120.       didWriteData:(int64_t)bytesWritten  
  121.  totalBytesWritten:(int64_t)totalBytesWritten  
  122. totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite  
  123. {  
  124.     //刷新进度条的delegate方法,同样的,获取数据,调用主线程刷新UI  
  125.     double currentProgress = totalBytesWritten/(double)totalBytesExpectedToWrite;  
  126.     dispatch_async(dispatch_get_main_queue(), ^{  
  127.         self.progressBar.progress = currentProgress;  
  128.         self.progressBar.hidden = NO;  
  129.     });  
  130. }  
  131.   
  132. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask  
  133.  didResumeAtOffset:(int64_t)fileOffset  
  134. expectedTotalBytes:(int64_t)expectedTotalBytes  
  135. {  
  136. }  
  137.   
  138. - (void)didReceiveMemoryWarning  
  139. {  
  140.     [super didReceiveMemoryWarning];  
  141. }  
  142.   
  143. @end  
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/li_yangyang_li/article/details/50618041

智能推荐

Report中的Drill down_crystal report drill down-程序员宅基地

文章浏览阅读3k次。在一个报表中点击转到其他地方一般称为Drill Down。 Reporting Service的最差,最多只能提供从列表到Chart的Drill Down比如从下面列表中,点击一个产品 转到一个chart Crystal Report支持点击Chart的drill down,功能应该最强强: 14.1.5 使用图表向下钻取 图表不仅是一种表现数据的方式,它还是一种分析工具。将光标移动到 _crystal report drill down

[Java]---图书管理系统(三)_图书管理系统的研究方法-程序员宅基地

文章浏览阅读481次。参考:http://blog.csdn.net/alextan_/article/details/65447446本系列是通过学习AlexTan这位博主的文章搭建一个图书管理系统,顺便再学习一下java这门语言。大二水了一学期java课,完全是菜鸡,所以注释很多自己的理解。这篇要解决的问题是:每次运行后数据无法保存。一、项目目录二、创建IO.java文件,代码如下:package to..._图书管理系统的研究方法

FFmpeg 视频编码--------把 .rgb 变成 .mp4_ffmpeg实时rgb编码-程序员宅基地

文章浏览阅读1.5k次。FFmpeg 视频编码一、什么是视频编码?视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。二、FFmpeg开发中的视频编码流程(..._ffmpeg实时rgb编码

年过35岁的程序员都去哪了?一张图道尽老程序员们的花样出路-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏6次。微信又改版了,为了方便第一时间看到我们的推送,请按照下列操作,设置“置顶”:点击上方蓝色字体“程序员之家”-点击右上角“…”-点击“设为星标”。可以啦,让我们继续相互陪伴..._35岁程序员的出路在哪

基于51单片机的带时间显示的红绿灯设计_使用51单片机制作一个红绿灯要求两位数码管实现时间-程序员宅基地

文章浏览阅读751次。仿真效果图:部分程序:i>0;i--)c>0;c--)b>0;b--)a>0;a--);_nop_;}}}{P1=0X12;delay(1);P1=0X00;delay(1);}}for(a;a>0;a--){while(j--){P1=0X24;P0=0XFE;P0=0XFd;}}P0=0XFF;}for(a;a>0;a--){资料内容包括:_使用51单片机制作一个红绿灯要求两位数码管实现时间

JNI中局部引用,全局引用,弱引用_片文库问答筛选 jni :全局引用&局部引用&弱全局引用_ bug 弄潮儿的博客﹣ csd-程序员宅基地

文章浏览阅读337次。// JNI引用变量// 引用类型主要是 局部引用和全局引用// 作用:在JNI中告知虚拟机何时回收一个JNI变量// 局部引用,通过DeleteLocalRef手动释放对象// 1,访问一个很大的java对象,使用完之后,还要进行复杂的耗时操作,// 2,创建了大量的局部引用,占用了太多的内存,而且局部引用跟后面的操作没有关联性。// 模拟:循环创建数据extern "C"J..._片文库问答筛选 jni :全局引用&局部引用&弱全局引用_ bug 弄潮儿的博客﹣ csd

随便推点

Java流程控制_不愿努力的帅洋-程序员宅基地

文章浏览阅读119次。程序流程控制顺序结构程序从上到下逐行执行,中间没有任何判断和跳转。如果没有任何流程控制,程序总是从上到下执行每条语句。分支结构根据条件,选择性地执行某段代码。有if-else和switch-case两种分支语句。if-else结构else是可选的针对多个条件表达式之间是“互斥”关系(或者没有交集的关系)。如果多个条件表达式之间有交集关系,需要根据实际情况,考虑应该将哪个结构声明在上面。如果多个条件表达式之间有包含关系,一定要先处理包含范围小的情况,否则范围小的没机会运行。i_不愿努力的帅洋

推荐一个整理Linux内核API的网站_linux api 网站-程序员宅基地

文章浏览阅读250次。Linux内核API整理_linux api 网站

解惑-这么多技术我该怎么学---语言风趣透彻 -程序员宅基地

文章浏览阅读408次。经常有同学问“这么多技术我该怎么学,某某和某某两个技术哪个更有前途”。因此我写了下面的小文章,也算是和如鹏网所有同学的一个交流常见总结吧。一、这多东西啥时候能学完?现在IT新技术日新月异。就常用编程语言而言,有c/c++、汇编、java,c#、Python等;操作系统平台有unix/linux,windows系列;开发工具有VC、VisualStudio2008、Eclipse、NetBeans等

汇川伺服常见故障处理_汇川伺服950报警怎么解决-程序员宅基地

文章浏览阅读4.7k次。③调整转矩限制值 0x60E0,0x60E1(EtherCat伺服)、H0710,H0709(脉冲伺服)②在应用场景允许情况下增大,0x6065(EtherCat伺服),H0A10(脉冲伺服)220V驱动器:正常值:310V,故障值:420V。380V驱动器:正常值:540V,故障值:760V。220V驱动器:正常值:310V,故障值:200V。380V驱动器:正常值:540V,故障值:380V。②如果不支持绝对值模式,设置H0201=0。伺服系统中,伺服驱动器的功率设置,驱动功率设置小于所带电机的功率。_汇川伺服950报警怎么解决

(已解决)WPS如何插入公式和数学表达式 // WPS如何插入网上文章的表达式_wps插入latex公式-程序员宅基地

文章浏览阅读1.5w次。5、举个例子 ,我们想输入ab(x)可以从左侧栏中找到相适应的下标上标等等(我们只需要修改相应的数字符号就行啦)11、再来到”Latex公式“把刚才copy的内容复制进”\[ \]“,点击预览插入就插入啦。9、点击“show Math As”再点击“Tex Commands"7、至于复制网上的数学符号和公式,下面是网上找的一张图,复制他的公式。4、注意,所有公式表达式都要在“\[ \]” 里面输入。3、根据需要选择“数学、化学、物理”等符号或者表达式。2、点击“插入”-->点击“Latex公式”_wps插入latex公式

木棒--C++_c++乔治拿起相同长度的棍子,随机切割。现在他想把棍子恢复到原来的状态,但是他忘-程序员宅基地

文章浏览阅读2k次。一、题目乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。注意: 数据中可能包含长度大于50的木棒,请在处理时忽略这些木棒。输入格式输入包含多组数据,每组数据包括..._c++乔治拿起相同长度的棍子,随机切割。现在他想把棍子恢复到原来的状态,但是他忘

推荐文章

热门文章

相关标签