#import "ViewController.h"

#import "ASIHTTPRequest.h"

#import <AFNetworking/AFNetworking.h>

@interface ViewController () <NSURLSessionDownloadDelegate>

@property (strong,
nonatomic) NSURLSessionDownloadTask *resumableTask;  
// 可恢复的下载任务

@property (strong,
nonatomic) NSURLSession *currentSession;   
// 当前会话

/* 用于可恢复的下载任务的数据 */

@property (strong,
nonatomic) NSData *partialData;

@property (weak,
nonatomic) IBOutlet UIProgressView *downloadingProgressView;

@property (weak,
nonatomic) IBOutlet UILabel *currentProgress_label;

@end

@implementation ViewController

- (void)viewDidLoad {

[super
viewDidLoad];

AFHTTPRequestOperationManager *man = [AFHTTPRequestOperationManager
manager];

}

/* 创建当前的session */

- (void)createCurrentSession {

NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration
defaultSessionConfiguration];

self.currentSession = [NSURLSession
sessionWithConfiguration:defaultConfig delegate:self
delegateQueue:nil];

self.currentSession.sessionDescription =
@"fdfd";

}

- (IBAction)download:(id)sender {

if (!self.currentSession) {

[self
createCurrentSession];

}

if (self.partialData) {
// 假设是之前被暂停的任务,就从已经保存的数据恢复下载

self.resumableTask = [self.currentSession
downloadTaskWithResumeData:self.partialData];

}

else {
// 否则创建下载任务

NSString *imageURLStr =
@"http://192.168.1.102/0701.zip";

NSURLRequest *request = [NSURLRequest
requestWithURL:[NSURL
URLWithString:imageURLStr]];

self.resumableTask = [self.currentSession
downloadTaskWithRequest:request];

}

[self.resumableTask
resume];

self.partialData =
nil;

}

- (IBAction)stop:(id)sender {

[self.resumableTask
cancelByProducingResumeData:^(NSData *resumeData) {

// 假设是可恢复的下载任务,应该先将数据保存到partialData中,注意在这里不要调用cancel方法

self.partialData = resumeData;

self.resumableTask =
nil;

NSLog(@"resumeData = %@", resumeData);

[resumeData writeToFile:@"/Users/Mac/Desktop/resumeData"
atomically:YES];

}];

}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {

NSLog(@"location = %@", location);

// 设置文件的存放目标路径

NSString *documentsPath =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES).firstObject;

NSURL *documentsDirectoryURL = [NSURL
fileURLWithPath:documentsPath];

NSURL *fileURL = [documentsDirectoryURL
URLByAppendingPathComponent:[[downloadTask.response
URL] lastPathComponent]];

// 假设该路径下文件已经存在。就要先将其移除,在移动文件

NSFileManager *fileManager = [NSFileManager
defaultManager];

if ([fileManager fileExistsAtPath:[fileURL
path] isDirectory:NULL]) {

[fileManager removeItemAtURL:fileURL
error:NULL];

}

[fileManager moveItemAtURL:location
toURL:fileURL error:NULL];

}

/* 从fileOffset位移处恢复下载任务 */

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

NSLog(@"NSURLSessionDownloadDelegate: Resume download at %lld", fileOffset);

}

/* 完毕下载任务,不管下载成功还是失败都调用该方法 */

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {

NSLog(@"NSURLSessionDownloadDelegate: Complete task");

NSLog(@"下载失败:%@", error);

}

/* 运行下载任务时有数据写入 */

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten  totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
// 期望收到的全部data字节数

{

// 计算当前下载进度并更新视图

double downloadProgress = totalBytesWritten / (double)totalBytesExpectedToWrite;

[self setDownloadProgress:downloadProgress];

}

/* 依据下载进度更新视图 */

- (void)setDownloadProgress:(double)progress {

NSString *progressStr = [NSString
stringWithFormat:@"%.1f", progress *
100];

progressStr = [progressStr stringByAppendingString:@"%"];

NSLog(@"progressStr = %@", progressStr);

dispatch_async(dispatch_get_main_queue(), ^{

self.downloadingProgressView.progress = progress;

self.currentProgress_label.text = progressStr;

});

}

@end

[self.currentSession downloadTaskWithResumeData:self.partialData];

通过resumeData的原因例如以下是resumeData内容

resumeData内容例如以下

<?xml version="1.0" encoding="UTF-8"?

>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>NSURLSessionDownloadURL</key>

<string>http://192.168.1.102/0701.zip</string>

<key>NSURLSessionResumeBytesReceived</key>

<integer>47271936</integer>

<key>NSURLSessionResumeCurrentRequest</key>

<data>

YnBsaXN0MDDUAQIDBAUGcnNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS

AAGGoK8QGAcIP0BGR05PUFFSU1Q1VVZiY2RlZmdobVUkbnVsbN8QGwkKCwwNDg8QERIT

FBUWFxgZGhscHR4fICEiIyQlJicoKSUrLC0nLycmJiYkNTYmOCY6Jjw9PlMkMTJSJDNT

JDI1UyQxN1IkNFMkMjFTJDEzViRjbGFzc1IkNVMkMThSJDZTJDIyUyQxNFIkN1MkMTlT

JDEwUiQ4UiQwUyQxNVMkMjNSJDlTJDExUiQxUyQyNFMkMTZSJDJTJDIwgAiAAoAAgAeA

A4AOgAKAF4AGgAyAB4APgAeAAIAAgACACBACgAqAAIAJgAAQCYAAgAsQFoANCNNBEEIm

REVXTlMuYmFzZVtOUy5yZWxhdGl2ZYAAgAWABF8QHWh0dHA6Ly8xOTIuMTY4LjEuMTAy

LzA3MDEuemlw0khJSktaJGNsYXNzbmFtZVgkY2xhc3Nlc1VOU1VSTKJMTVVOU1VSTFhO

U09iamVjdCNATgAAAAAAABAACREBhCMAAAAAAAAAACMAAAAAAAAAABP//////////1NH

RVTTV1gQWV1hV05TLmtleXNaTlMub2JqZWN0c6NaW1yAEIARgBKjXl9ggBOAFIAVgBZf

EA9BY2NlcHQtRW5jb2RpbmdWQWNjZXB0XxAPQWNjZXB0LUxhbmd1YWdlXWd6aXAsIGRl

ZmxhdGVTKi8qVWVuLXVz0khJaWpcTlNEaWN0aW9uYXJ5omtsXE5TRGljdGlvbmFyeVhO

U09iamVjdNJISW5vXE5TVVJMUmVxdWVzdKJwcVxOU1VSTFJlcXVlc3RYTlNPYmplY3Rf

EA9OU0tleWVkQXJjaGl2ZXLRdHVUcm9vdIABAAgAEQAaACMALQAyADcAUgBYAJEAlQCY

AJwAoACjAKcAqwCyALUAuQC8AMAAxADHAMsAzwDSANUA2QDdAOAA5ADnAOsA7wDyAPYA

+AD6APwA/gEAAQIBBAEGAQgBCgEMAQ4BEAESARQBFgEYARoBHAEeASABIgEkASYBKAEq

ASwBLQE0ATwBSAFKAUwBTgFuAXMBfgGHAY0BkAGWAZ8BqAGqAasBrgG3AcAByQHNAdQB

3AHnAesB7QHvAfEB9QH3AfkB+wH9Ag8CFgIoAjYCOgJAAkUCUgJVAmICawJwAn0CgAKN

ApYCqAKrArAAAAAAAAACAQAAAAAAAAB2AAAAAAAAAAAAAAAAAAACsg==

</data>

<key>NSURLSessionResumeEntityTag</key>

<string>"c04546-5c3ca3fe-5162cb9046b80"</string>

<key>NSURLSessionResumeInfoLocalPath</key>

<string>/Users/Mac/Library/Developer/CoreSimulator/Devices/E460928F-4469-41A7-B94E-8E6372A96C89/data/Containers/Data/Application/8E686354-BA1D-408E-8124-56AC07CD7287/tmp/CFNetworkDownload_brs2kY.tmp</string>

<key>NSURLSessionResumeInfoVersion</key>

<integer>1</integer>

<key>NSURLSessionResumeOriginalRequest</key>

<data>

YnBsaXN0MDDUAQIDBAUGTk9YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS

AAGGoK4HCDM0OjtCQ0RFRkdISVUkbnVsbN8QFQkKCwwNDg8QERITFBUWFxgZGhscHR4f

ICEfIyQlICAoKCgeLC0uKDAxMlMkMTJSJDNTJDE3UiQ0UyQxM1YkY2xhc3NSJDVTJDE4

UiQ2UyQxNFIkN1MkMTlTJDEwUiQ4UiQwUyQxNVIkOVMkMTFSJDFTJDE2UiQygAiAAoAH

gAOAAoANgAaADIAHgAeAAIAAgACACBACgAqACYAAEAmACxAQCNM1DjYoODlXTlMuYmFz

ZVtOUy5yZWxhdGl2ZYAAgAWABF8QHWh0dHA6Ly8xOTIuMTY4LjEuMTAyLzA3MDEuemlw

0jw9Pj9aJGNsYXNzbmFtZVgkY2xhc3Nlc1VOU1VSTKJAQVVOU1VSTFhOU09iamVjdCNA

TgAAAAAAABAACREBgCMAAAAAAAAAACMAAAAAAAAAABP//////////9I8PUpLXE5TVVJM

UmVxdWVzdKJMTVxOU1VSTFJlcXVlc3RYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLR

UFFUcm9vdIABAAgAEQAaACMALQAyADcARgBMAHkAfQCAAIQAhwCLAJIAlQCZAJwAoACj

AKcAqwCuALEAtQC4ALwAvwDDAMYAyADKAMwAzgDQANIA1ADWANgA2gDcAN4A4ADiAOQA

5gDoAOoA7ADuAPAA8QD4AQABDAEOARABEgEyATcBQgFLAVEBVAFaAWMBbAFuAW8BcgF7

AYQBjQGSAZ8BogGvAbgBygHNAdIAAAAAAAACAQAAAAAAAABSAAAAAAAAAAAAAAAAAAAB

1A==

</data>

<key>NSURLSessionResumeServerDownloadDate</key>

<string>Sat, 16 May 2015 06:03:42 GMT</string>

</dict>

</plist>

版权声明:本文博主原创文章,博客,未经同意不得转载。

NSURLSessionDownloadTask 断点下载的更多相关文章

  1. iOS 大文件断点下载

    iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...

  2. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  3. iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载

    官方建议AFN的使用方法   0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目   •2. 或使用Cocopod 导入AFNetworking3.0+   •3.   ...

  4. iOS开发-大文件下载与断点下载思路

    大文件下载方案一:利用NSURLConnection和它的代理方法,及NSFileHandle(iOS9后不建议使用)相关变量: @property (nonatomic,strong) NSFile ...

  5. iOS- 利用AFNetworking(AFN) - 实现文件断点下载

    https://www.cnblogs.com/qingche/p/3500746.html 1. 定义一个全局的AFHttpClient:包含有 1> baseURL 2> 请求 3&g ...

  6. Java实现多线程断点下载(下载过程中可以暂停)

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...

  7. 安卓(android)之实现断点下载功能

    一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...

  8. 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】

    一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...

  9. IOS 断点下载

    // // ViewController.m // UI4_断点下载 // // Created by qianfeng on 15/8/19. // Copyright (c) 2015年 ZBC. ...

随机推荐

  1. iOS开发之Runloop(转)

    Objective-C之run loop详解 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9237973 转载请注明出 ...

  2. python基础知识(引用)

    文章连接:http://xianglong.me/article/how-to-code-like-a-pythonista-idiomatic-python/

  3. sharepoint 2013创建外部内容类型并创建外部列表

    步骤: 1.如何:基于 SQL Server 表创建外部内容类型 How to: Create an External Content Type Based on a SQL Server Table ...

  4. 【UVA 11865】 Stream My Contest (二分+MDST最小树形图)

    [题意] 你需要花费不超过cost元来搭建一个比赛网络.网络中有n台机器,编号0~n-1,其中机器0为服务器,其他机器为客户机.一共有m条可以使用的网线,其中第i条网线的发送端是机器ui,接收端是机器 ...

  5. 【Xamarin挖墙脚系列:Xamarin开发环境配置需求】

    原文:[Xamarin挖墙脚系列:Xamarin开发环境配置需求] 前言 因为操作的全是大块头,加大你们的内存,CPU网上飙.... 卤煮的机器配置  最近的版本部署包,百度云离线下载:版本:Xama ...

  6. win7下登陆中国银行网上银行IE浏览器版本过高问题解决

    2013-11-23 2013-11-23登录中国银行出现以下提示. 操作系统为windows7 64位旗舰版,搜狗浏览器版本为4.1.1.7598.想不到突然出现如下提示.打电话去问,告知使用IE7 ...

  7. [cocos2d]cocos2d 2.1与ios 6.0

    最近把xcode升级到4.5了,ios也编程6.0 mark一下需要修改的地方(针对于cocos2d 2.1版本),虽然都是warning,但是对于强迫症患者来说无法忍受啊~ 修改一 libs-Coc ...

  8. 【CF】259 Div.1 B Little Pony and Harmony Chest

    还蛮有趣的一道状态DP的题目. /* 435B */ #include <iostream> #include <string> #include <map> #i ...

  9. 使用GDI+轻松创建缩略图

    Gdi+ 还是相当好用的. 1> Image保存图像,需要一个CLSID的参数,它可以这样获得: int   GetEncoderClsid(const   WCHAR*   format,   ...

  10. VM Depot 新功能:直接通过 Windows Azure 管理门户部署虚拟机

     发布于 2014-05-09 作者 陈 忠岳 想要尝试 VM Depot 上数以百计的各类开源虚拟机,却因为复杂的命令行操作而感到烦恼?微软开放技术想您所想,及时推出 VM Depot 最新功能 ...