转自:http://www.maxiaoguo.com/clothes/268.html
NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的。在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉。
//////////////////////
//
// MJViewController.m
// 01.URLSession 上传
//
// Created by apple on 14-4-30.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import "MJViewController.h"
@interface MJViewController ()
@end
@implementation MJViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self uploadFile1];
}
#pragma mark - 监控上传进度
- (void)uploadFile1
{
// 1. URL
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"head8.png" withExtension:nil];
NSURL *url = [NSURL URLWithString:@"http://localhost/uploads/1.png"];
// 2. Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:2.0f];
// 1> PUT方法
// PUT
// 1) 文件大小无限制
// 2) 可以覆盖文件
// POST
// 1) 通常有限制2M
// 2) 新建文件,不能重名
request.HTTPMethod = @"PUT";
// 2> 安全认证
// admin:123456
// result base64编码
// Basic result
/**
BASE 64是网络传输中最常用的编码格式 - 用来将二进制的数据编码成字符串的编码方式
BASE 64的用法:
1> 能够编码,能够解码
2> 被很多的加密算法作为基础算法
*/
NSString *authStr = @"admin:123456";
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64Str = [authData base64EncodedStringWithOptions:0];
NSString *resultStr = [NSString stringWithFormat:@"Basic %@", base64Str];
[request setValue:resultStr forHTTPHeaderField:@"Authorization"];
// 3. Session,全局单例(我们能够给全局的session设置代理吗?如果不能为什么?)
// sharedSession是全局共享的,因此如果要设置代理,需要单独实例化一个Session
/**
NSURLSessionConfiguration(会话配置)
defaultSessionConfiguration; // 磁盘缓存,适用于大的文件上传下载
ephemeralSessionConfiguration; // 内存缓存,以用于小的文件交互,GET一个头像
backgroundSessionConfiguration:(NSString *)identifier; // 后台上传和下载
*/
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
// 需要监听任务的执行状态
NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromFile:fileURL];
// 4. resume
[task resume];
}
#pragma mark - 上传进度的代理方法
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
// bytesSent totalBytesSent totalBytesExpectedToSend
// 发送字节(本次发送的字节数) 总发送字节数(已经上传的字节数) 总希望要发送的字节(文件大小)
NSLog(@"%lld-%lld-%lld-", bytesSent, totalBytesSent, totalBytesExpectedToSend);
// 已经上传的百分比
float progress = (float)totalBytesSent / totalBytesExpectedToSend;
NSLog(@"%f", progress);
}
#pragma mark - 上传完成的代理方法
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"完成 %@", [NSThread currentThread]);
}
@end
//
// MJViewController.m
// 02.Session下载
//
// Created by apple on 14-4-30.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import "MJViewController.h"
@interface MJViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
/**
// 下载进度跟进
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
didWriteData totalBytesWritten totalBytesExpectedToWrite
本次写入的字节数 已经写入的字节数 预期下载的文件大小
// 完成下载
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location;
*/
@implementation MJViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self downloadTask];
}
#pragma mark - 下载(GET)
- (void)downloadTask
{
// 1. URL
NSURL *url = [NSURL URLWithString:@"http://localhost/itcast/images/head1.png"];
// 2. Request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:2.0];
// 3. Session
NSURLSession *session = [NSURLSession sharedSession];
// 4. download
[[session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
// 下载的位置,沙盒中tmp目录中的临时文件,会被及时删除
NSLog(@"下载完成 %@ %@", location, [NSThread currentThread]);
/**
document 备份,下载的文件不能放在此文件夹中
cache 缓存的,不备份,重新启动不会被清空,如果缓存内容过多,可以考虑新建一条线程检查缓存目录中的文件大小,自动清理缓存,给用户节省控件
tmp 临时,不备份,不缓存,重新启动iPhone,会自动清空
*/
// 直接通过文件名就可以加载图像,图像会常驻内存,具体的销毁有系统负责
// [UIImage imageNamed:@""];
dispatch_async(dispatch_get_main_queue(), ^{
// 从网络下载下来的是二进制数据
NSData *data = [NSData dataWithContentsOfURL:location];
// 这种方式的图像会自动释放,不占据内存,也不需要放在临时文件夹中缓存
// 如果用户需要,可以提供一个功能,保存到用户的相册即可
UIImage *image = [UIImage imageWithData:data];
self.imageView.image = image;
});
}] resume];
// [task resume];
}
@end