NSURLConnection通过全局状态来管理cookies、认证信息等公共资源,这样如果遇到两个连接需要使用不同的资源配置情况时就无法解决了,但是这个问题在NSURLSession中得到了解决。NSURLSession同时对应着多个连接,会话通过工厂方法来创建,同一个会话中使用相同的状态信息。NSURLSession支持进程三种会话:

  1. defaultSessionConfiguration:进程内会话(默认会话),用硬盘来缓存数据。
  2. ephemeralSessionConfiguration:临时的进程内会话(内存),不会将cookie、缓存储存到本地,只会放到内存中,当应用程序退出后数据也会消失。
  3. backgroundSessionConfiguration:后台会话,相比默认会话,该会话会在后台开启一个线程进行网络数据处理。

下面将通过一个文件下载功能对两种会话进行演示,在这个过程中也会用到任务的代理方法对上传操作进行更加细致的控制。下面先看一下使用默认会话下载文件,代码中演示了如何通过NSURLSessionConfiguration进行会话配置,如果通过代理方法进行文件下载进度展示(类似于前面中使用NSURLConnection代理方法,其实下载并未分段,如果需要分段需要配合后台进行),同时在这个过程中可以准确控制任务的取消、挂起和恢复。

//
// ViewController.m
// NSURLSession会话
//
// Copyright © 2016年 asamu. All rights reserved.
// #import "ViewController.h"
@interface ViewController ()<NSURLSessionDownloadDelegate>
{
NSURLSessionDownloadTask *_downloadTask;
} @property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView; @property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIButton *downBtn; @end @implementation ViewController
#pragma mark -- UI方法
- (void)viewDidLoad {
[super viewDidLoad];
_progressView.progress = ;
}
#pragma mark 按钮点击事件
- (IBAction)download:(id)sender { NSString *filename = _textField.text;
NSString *urlStr = [NSString stringWithFormat:@"http://mr7.doubanio.com/832d52e9c3df5c13afd7243a770c094f/0/fm/song/p294_128k.mp3",filename];
NSURL *url = [NSURL URLWithString:urlStr];
//创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//创建会话
//默认会话
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
//请求超过时间
sessionConfiguration.timeoutIntervalForRequest = 5.0f;
//是否允许使用蜂窝
sessionConfiguration.allowsCellularAccess = true;
//创建会话
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
_downloadTask = [session downloadTaskWithRequest:request];
[_downloadTask resume];
} - (IBAction)cancel:(id)sender {
[_downloadTask cancel];
_label.text = @"Cancel";
} - (IBAction)suspend:(id)sender {
[_downloadTask suspend];
_label.text =@"Suspend";
}
- (IBAction)resume:(id)sender {
[_downloadTask resume];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark - 设置界面状态
-(void)setUIStatus:(int64_t)totalBytesWritten expectedTowrite:(int64_t)totalBytesExpectedWritten{
//更新 UI 放到主线程
dispatch_async(dispatch_get_main_queue(), ^{
//设置进度条
_progressView.progress = (float)totalBytesWritten / totalBytesExpectedWritten; if (totalBytesWritten == totalBytesExpectedWritten) { _label.text = @"Finish download";
//关网
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
_downBtn.enabled = YES; }else{ _label.text = @"Downing...";
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
});
}
#pragma mark - 下载任务代理
#pragma mark 下载中(会多次调用,可以记录下载进度)
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
[self setUIStatus:totalBytesWritten expectedTowrite:totalBytesExpectedToWrite];
}
#pragma mark 下载完成
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
NSError *error;
//注释见上篇,懒得写。。。
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
NSString *savePath = [cachePath stringByAppendingPathComponent:_textField.text];
NSLog(@"%@",savePath); NSURL *url = [NSURL fileURLWithPath:savePath]; [[NSFileManager defaultManager]moveItemAtURL:location toURL:url error:&error];
if (error) {
NSLog(@"%@",error.localizedDescription);
}
}
#pragma mark 任务完成,不管是否下载成功
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
if (error) {
NSLog(@"%@",error.localizedDescription);
}
}
@end

Storyboard如右图:

iOS 学习 - 10下载(4) NSURLSession 会话 篇的更多相关文章

  1. iOS 学习 - 10下载(3) NSURLSession 音乐 篇

    使用 NSURLSession 下载,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中 // // ViewController.m // Web ...

  2. iOS 学习 - 10下载(2) NSURLSession 图片 篇

    使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...

  3. iOS 学习 - 10下载(1) NSURLConnection 篇

    程序的实现需要借助几个对象: NSURLRequest:建立了一个请求,可以指定缓存策略.超时时间.和NSURLRequest对应的还有一个NSMutableURLRequest,如果请求定义为NSM ...

  4. ios学习- 10大iOS开发者最喜爱的类库

    该10大iOS开发者最喜爱的库由“iOS辅导团队”成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个最好的库: 1)不能 ...

  5. iOS学习10之OC类和对象

    本次是OC的第一节课,主要是学习和理解类与对象 1.面向对象 1> OOP(Object Oriented Programming)面向对象编程. 面向对象以事物为中心,完成某件事情都需要哪些事 ...

  6. iOS学习笔记13-网络(二)NSURLSession

    在2013年WWDC上苹果揭开了NSURLSession的面纱,将它作为NSURLConnection的继任者.现在使用最广泛的第三方网络框架:AFNetworking.SDWebImage等等都使用 ...

  7. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  8. iOS学习笔记之异步图片下载

    写在前面 在iOS开发中,无论是在UITableView还是在UICollectionView中,通过网络获取图片设置到cell上是较为常见的需求.尽管有很多现存的第三方库可以将下载和缓存功能都封装好 ...

  9. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

随机推荐

  1. canvas画简单电路图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Json.Net

    下载地址:Json.NET 文档地址:Json.NET Documentation 基本的序列化与反序列化 public class Product { public string Name { ge ...

  3. 使用archiver在nodejs下打包

    archiver是一个在nodejs中能跨平台实现打包功能的模块,可以打zip和tar包,是一个比较好用的三方模块. 使用前先安装archiver模块. npm install archiver 建立 ...

  4. ASP.NET MVC初识

    最近在博客园看到了很多关于MVC的示例,自己打算写下来记录一下,如果有写得不对的地方,望大侠指出! 开始搭建项目 1. 建立Web项目 文件—>新建项目—>选择ASP.NET MVC4 W ...

  5. SignalR入门之基本介绍

    SignalR是微软对web开发技术的扩充,它是一种框架,方便用来创建实时应用程序. 有一些即时消息系统,实时协作工作集,多人在线游戏,信息广播服务等其他需要在信息产生时就能进行发送的任务系统. 对于 ...

  6. C#中考虑为大对象使用弱引用

    1.无论怎样尽力,我们总是会使用到某些需要大量内存的数据,而这些内存并不需要经常访问.或许你需要从一个大文件中查找某个特定的值,或者算法需要一个较大的查询表.这时,你也许会采用2中不太好做法:第一种是 ...

  7. <if><else/></if> 语句

    <li> <if condition="$nid eq 'partner'"> <a href="javascript:void(0);&q ...

  8. MySQL: LEAVE Statement

    https://www.techonthenet.com/mysql/loops/leave.php This MySQL tutorial explains how to use the LEAVE ...

  9. How to return dictionary keys as a list in Python 3.3

    http://btmiller.com/2015/04/13/get-list-of-keys-from-dictionary-in-python-2-and-3.html Get a List of ...

  10. Delphi 10.1 Berlin 官方未列之修正

    Delphi 10.1 Berlin 官方修正列表: Bug fix list for RAD Studio 10.1 Berlin Delphi 10.1 Berlin 官方未列之修正: 修正 iO ...