1 // <NSURLSessionDownloadDelegate> 代理 2 /*如果要监听 session 的下载进度,不能使用 `sharedSession` 3 * 是一个全局的单例 4 */ 5 NSURL *url = [NSURL URLWithString:@"http://填入你要访问的资源"]; 6 7 NSLog(@"start"); 8 9 // 如果发起的任务带有 completion 回调,不会走代理! 10 // [[self.session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { 11 // NSLog(@"%@ %@", location, [NSThread currentThread]); 12 // }] resume]; 13 // 直接建立下载任务并且启动,后续的进度监听由代理负责 14 [[self.session downloadTaskWithURL:url] resume]; 15 #pragma mark - 下载代理方法 16 // 必须的 17 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { 18 NSLog(@"%@", location); 19 } 20 21 // 在 iOS 7.0 是必须的 22 /** 23 session 24 downloadTask 25 bytesWritten 本次下载字节数 26 totalBytesWritten 已经下载字节数 27 totalBytesExpectedToWrite 总大小 28 */ 29 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { 30 31 float progress = (float)totalBytesWritten / totalBytesExpectedToWrite; 32 NSLog(@"%f %@", progress, [NSThread currentThread]); 33 } 34 35 // 在 iOS 7.0 是必须的 36 // 续传代理方法,没什么用处 37 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes { 38 NSLog(@"%s", __FUNCTION__); 39 } 40 41 #pragma mark - 懒加载 42 - (NSURLSession *)session { 43 if (_session == nil) { 44 /** 45 * 下载本身是有一个独立线程`顺序`完成的! 46 47 1. 会话配置,大多使用 默认的 48 2. 代理 self 49 3. `代理工作的队列`,可以使用 nil 50 ** 根下载没有任何关系,指定`代理工作的队列` 51 ** 无论选择什么队列,都不会影响主线程! 52 53 - nil 会新建一个队列,NSOperation 中没有串行队列的概念!白胡子老头! 54 - [[NSOperationQueue alloc] init] 和 nil 相同 55 - [NSOperationQueue mainQueue] 代理方法在主线程异步执行! 56 57 * 如果代理方法中,有耗时操作,就选择异步队列 58 * 如果没有耗时操作,选择主队列 59 */ 60 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 61 62 _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 63 } 64 return _session; 65 }
原文:http://www.cnblogs.com/iosBike/p/4590932.html