实战iOS7之NSURLSession

[size=large][b]NSURLSession VS NSURLConnection[/b][/size]
NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有:

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

[img]http://dl2.iteye.com/upload/attachment/0093/6229/176fea1f-acd8-3e3a-a0bc-a5dfd047366f.png[/img]

[size=large][b]用法[/b][/size]
使用NSURLSession的一般套路如下:
[list]
[*]1. 定义一个NSURLRequest
[*]2. 定义一个NSURLSessionConfiguration,配置各种网络参数
[*]3. 使用NSURLSession的工厂方法获取一个所需类型的NSURLSession
[*]4. 使用定义好的NSURLRequest和NSURLSession构建一个NSURLSessionTask
[*]5. 使用Delegate或者CompletionHandler处理任务执行过程的所有事件。
[/list]
[size=large][b]实战[/b][/size]
这儿我简单的实现了一个下载任务的断点续传功能,具体效果如下:

[img]http://dl2.iteye.com/upload/attachment/0093/6228/e2b20ad7-3788-371a-83e4-65e95add8bb9.gif[/img]

实现代码如下:
#import "UrlSessionDemoViewController.h"

@interface UrlSessionDemoViewController ()

@end

@implementation UrlSessionDemoViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
self.progressBar.progress = 0;
}


- (NSURLSession *)session
{
//创建NSURLSession
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
return session;
}

- (NSURLRequest *)request
{
//创建请求
NSURL *url = [NSURL URLWithString:@"http://p1.pichost.me/i/40/1639665.png"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
return request;
}

-(IBAction)start:(id)sender
{
//用NSURLSession和NSURLRequest创建网络任务
self.task = [[self session] downloadTaskWithRequest:[self request]];
[self.task resume];
}

-(IBAction)pause:(id)sender
{
NSLog(@"Pause download task");
if (self.task) {
//取消下载任务,把已下载数据存起来
[self.task cancelByProducingResumeData:^(NSData *resumeData) {
self.partialData = resumeData;
self.task = nil;
}];
}
}

-(IBAction)resume:(id)sender
{
NSLog(@"resume download task");
if (!self.task) {
//判断是否又已下载数据,有的话就断点续传,没有就完全重新下载
if (self.partialData) {
self.task = [[self session] downloadTaskWithResumeData:self.partialData];
}else{
self.task = [[self session] downloadTaskWithRequest:[self request]];
}
}
[self.task resume];
}

//创建文件本地保存目录
-(NSURL *)createDirectoryForDownloadItemFromURL:(NSURL *)location
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *documentsDirectory = urls[0];
return [documentsDirectory URLByAppendingPathComponent:[location lastPathComponent]];
}
//把文件拷贝到指定路径
-(BOOL) copyTempFileAtURL:(NSURL *)location toDestination:(NSURL *)destination
{

NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtURL:destination error:NULL];
[fileManager copyItemAtURL:location toURL:destination error:&error];
if (error == nil) {
return true;
}else{
NSLog(@"%@",error);
return false;
}
}

#pragma mark NSURLSessionDownloadDelegate
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
//下载成功后,文件是保存在一个临时目录的,需要开发者自己考到放置该文件的目录
NSLog(@"Download success for URL: %@",location.description);
NSURL *destination = [self createDirectoryForDownloadItemFromURL:location];
BOOL success = [self copyTempFileAtURL:location toDestination:destination];

if(success){
// 文件保存成功后,使用GCD调用主线程把图片文件显示在UIImageView中
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *image = [UIImage imageWithContentsOfFile:[destination path]];
self.imageView.image = image;
self.imageView.contentMode = UIViewContentModeScaleAspectFit;
self.imageView.hidden = NO;
});
}else{
NSLog(@"Meet error when copy file");
}
self.task = nil;
}

/* Sent periodically to notify the delegate of download progress. */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
//刷新进度条的delegate方法,同样的,获取数据,调用主线程刷新UI
double currentProgress = totalBytesWritten/(double)totalBytesExpectedToWrite;
dispatch_async(dispatch_get_main_queue(), ^{
self.progressBar.progress = currentProgress;
self.progressBar.hidden = NO;
});
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes
{
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}

@end

所有代码在这儿:[url]https://github.com/xianlinbox/iOS7_New/tree/master/iOS7_New/NSURLSession/ViewController[/url]

参考文章:[url]http://www.objc.io/issue-5/from-nsurlconnection-to-nsurlsession.html[/url]
[url]http://www.shinobicontrols.com/blog/posts/2013/09/20/ios7-day-by-day-day-1-nsurlsession[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值