网络编程(三) 下载任务,支持断点续传

实现效果图:

注意点:1.下载的文件会保存在沙盒目录下的tmp文件夹内,这个文件夹专门存储一些临时文件,我们需要在下载完成后把文件移动到自己需要的文件夹内,并修改文件的扩展名

2.有部分链接使用下载时resume data = nil;这样断点续传功能就没有用了;

在storyboard里面添加button,progressView和显示进度的label,并进行连线

ViewController.m代码

#import "ViewController.h"

@interface ViewController ()<
NSURLSessionDownloadDelegate
>
{
    NSURLSessionDownloadTask *downTask;
    NSData *myResumeData;
    NSURLSession *session;
    NSString *fielName;

}

@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;

@end

@implementation ViewController

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

//创建下载任务
- (IBAction)downloadAction:(id)sender
{
    if (downTask)
    {
        return;
    }
    //构造需要下载的url链接

    NSURL *url = [NSURL URLWithString:@"http://apk500.bce.baidu-mgame.com/game/883000/883227/20160127061354_oem_5004211.apk?r=1"];
    //设置保存文件名为url的最后部分
    fielName = [url lastPathComponent];
    //设置session工作类型为默认
    NSURLSessionConfiguration *sessionCf = [NSURLSessionConfiguration defaultSessionConfiguration];
    //用sessionConfig配置session
    session = [NSURLSession sessionWithConfiguration:sessionCf delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    //设置任务类型
    downTask = [session downloadTaskWithURL:url];

    //发送任务请求
    [downTask resume];

}

//暂停下载任务
- (IBAction)pauseAction:(UIButton *)sender
{
    if (downTask.state == NSURLSessionTaskStateRunning)
    {
        [downTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
            //If resume data cannot be created, the completion handler will be called with nil resumeData
            myResumeData = resumeData;
            downTask = nil;
        }];
    }

}
//恢复下载任务
- (IBAction)resumeAction:(id)sender
{
    if (myResumeData)
    {
        downTask = [session downloadTaskWithResumeData:myResumeData];
        [downTask resume];

        myResumeData = nil;
    }
}
//把下载来的文件移动到Documents文件夹下并修改扩展名
- (void)moveFileToDocuments:(NSURL *)location
{
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *newPath = [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"/Documents/%@",fielName]];
    fielName = nil;
    NSLog(@"%@",newPath);

    [manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:newPath] error:nil];

}

#pragma mark - NSURLSessionDownloadDelegate

//在下载完成后调用
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    NSLog(@"%@",location);
    [self moveFileToDocuments:location];
}

//进度条相关设置
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    float progress = (float)totalBytesWritten / totalBytesExpectedToWrite;
    self.progressView.progress = progress;
    self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress* 100];

}
时间: 2024-10-08 13:01:41

网络编程(三) 下载任务,支持断点续传的相关文章

[IOS_HTTP]ASIHTTPRequest下载示例(支持断点续传)

在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐.下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理在我的博客:http://www.cnblogs.com/webapplee/p/3784599.html 中有具体的介绍,今天重点介绍如何实现,废话少说,开始正文: 一.创建网络请求队列 首先,创建网络请求队列,如下: ASINetworkQueue   *que = [[ASINetworkQu

iOS网络编程(三) 异步加载及缓存图片----&gt;SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag

网络编程三素概述

1.1网络编程概述计算机网络 ●是指将地理位置不同的具有独立功能的多 台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 网络编程●在网络通信协议下, 实现网络互连的不同计算机上运行的程序间可以进行数据交换 网络编程三要素 IP地址●要想让网络中的计算 机能够互相通信,必须为每台计算机指定一个标识号, 通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号.也就是设备的标识 端口●网

网络编程模型及网络编程三要素

网络模型 计算机网络之间以何种规则进行通信,就是网络模型研究问题. 网络模型一般是指 OSI(Open SystemInterconnection开放系统互连)参考模型 TCP/IP参考模型 网络模型7层概述: 1.物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换).这一层的数据叫做比特. 2. 数据链路层:主要将从物理层接收的数

打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)

  利用cURL实现单个文件分多段同时下载,支持断点续传(修订版) [复制链接] 摘自 http://bbs.chinaunix.net/thread-917952-1-1.html 在ubuntu下测试通过, 适合在支持多线程下载的站点下载文件 可以配合flashgot在firefox中使用 用法:./mycurl url [referedUrl] 第一个参数url是要下载的文件的地址,第二个参数referedUrl是指需要参照的网址(一般不需要,有些网站,比如华军需要此参数) 例如: ./m

winform网络编程(三)

TcpClient类和TcpListener类 (1)TcpClient的用途: 用于在同步阻止模式下通过网络来链接.发送和接受流数据,在此情况下,必须有侦听此连接的请求,而侦听的任务就交给TcpListener实例或Socket实例 (2)TcpClient的两种方法连接到侦听器 第一种:创建一个TcpClient,并调用3个可用的Connect方法之一 第二种:使用远程主机的主机名和端口号创建TcpClient,此构造函数将自动尝试一个连接 (3)TcpClient的常用属性和方法 Avai

IOS开发之网络编程(请求数据和断点续传)

IOS开发中网络编程应用场景:JSON数据获取,网络数据的下载. 一:请求JSON数据一般用异步请求的方式,如果用同步请求,则会造成IOS界面的执行过程阻塞,即界面部分在请求数据的过程中必须等待数据加载完毕. JSON数据的获取步骤: 1.设置网络地址的字符串:NSString *URLString = @"http://www.baidu.com"; 2.创建URL:NSURL *URL = [NSURL URLWithString:URLString]; 3.创建请求:NSURLR

C# http下载(支持断点续传)

分享下项目里面自己封装的一个http下载类 功能如下: 1.支持断点续传 2.下载失败自动重试 3.超时等异常处理 using System; using System.Collections.Generic; using System.IO; using System.Net; public class HttpManager { const int bytebuff = 1024; const int ReadWriteTimeOut = 2 * 1000;//超时等待时间 const in

网络编程三---多线程/进程解决并发问题

前文列出的代码给大家展示了一个最简单的网络程序,但正如文章末尾所提的,这个最简单的网络程序最大的缺点是服务端一次只能服务一个客户端,就比如说你去吃饭,饭店只有一个服务员, 而且服务员在客户离开之前只能为一个客户服务,也就是说你只能等待你前面的客户吃好饭离开了,然后你才能进去吃饭,而在你吃饭的时候时候,你后面来的人都得等你吃完饭才能轮到你后面一个人吃饭.这种模式的缺点很明显,因为在你进去点好菜到买单前的这段时间,这个服务员都是空闲的,为什么不让服务员在这个空闲时间让其他客户进来服务员为他点菜呢?在

Linux 网络编程三(socket代码详解)

//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>//htons()函数头文件 #include <ne