首先分析下载资源到本地,就得有URL ,点击btn ,就会解析网络地址,获取数据,就得有进度条控件

NSURLSession类的实现,通过委托代理模式去实现一些方法,需遵守<NSURLSessionDownloadDelegate>,委托代理设计模式在iOS开发中得到大量使用

 /*
 利用NSURLConnection实现断点续传
 1.NSURLSession,iOS7中推出的一个类,有取代NSURLConnection
 2.实现文件的下载与上传,而NSURLSessionData有两个子类:NSURLSessionDownloadTask实现文件的下载和NSURLSessionUploadTask实现文件上传
 3.NSURLSession的获取
 NSURLSession 的获取通过NSURLSessionDownloadTaskDelegate的方法获取,但是必须遵守该协议
 4.下载任务的创建
 NSURLSessionDownloadTask
 5.NSURLSessionDownloadDelegate
 6.沙盒路径的获取
 7.cache路径的获取及里面文件名的创建
 */
 
 

1.进行UI界面布局   用StoryBoard加载

一个Button,进度条,子类化的view显示进度的更新,view里面使用贝塞尔曲线画圆,并添加约束

2.定义全局的属性

 @interface ViewController ()<NSURLSessionDownloadDelegate>
@property (weak, nonatomic) IBOutlet MyProgressView *progressView;

@property (weak, nonatomic) IBOutlet UIButton *btn;
@property (weak, nonatomic) IBOutlet UIProgressView *myProgressView;
@property (weak, nonatomic) IBOutlet UILabel *myProgressLabel;

//下载任务
@property(nonatomic,strong)NSURLSessionDownloadTask *task;
//记录上次暂停下载返回的记录
@property(nonatomic,strong)NSData *resumeData;
//创建下载任务属性
@property(nonatomic,strong)NSURLSession *session;

@end

.m的执行代码如下

 @implementation ViewController
//懒加载下载任务属性
- (NSURLSession *)session
{
    if (!_session) {
        NSURLSessionConfiguration *configuration=[NSURLSessionConfiguration defaultSessionConfiguration];
        self.session=[NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    }
    return _session;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    
}
#pragma mark--开始下载
- (void)start
{
    //1.创建下载任务
    NSURL *url=[NSURL URLWithString:@"http://vfx.mtime.cn/Video/2015/07/04/mp4/150704102229172451_480.mp4

"];
    self.task=[self.session downloadTaskWithURL:url];
    //2.开始下载任务
    [self.task resume];
}
#pragma mark---暂停下载
- (void)pause
{
    //这里存在强引用嵌套,将self进行弱引用
    /*
     1.self对task进行了强引用,task 又对block 进行了引用,block又对self进行了引用,这就形成了循环引用
     解决方法:对self 进行弱引用,__weak typedef(self)vc=self;
     2.如果设置了实现和block,有实现了代理方法,程序优先执行block
     */
    __weak typeof(self)vc=self;
    [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        vc.resumeData=resumeData;
        vc.task=nil;
    }];
}
#pragma mark---断点下载
- (void)resume
{
    if (self.resumeData.length>0) {
        self.task=[self.session downloadTaskWithResumeData:self.resumeData];
        [self.task resume];
        self.resumeData=nil;
    }
    
    
}
- (IBAction)btnAct:(UIButton *)sender {
    sender.selected=!sender.isSelected;
    if (self.task==nil) {
        if (self.resumeData) {
            //断点续传
            [self resume];
        }
        else{
            //开始下载
            [self start];
        }
    }
    else
    {
        //暂停下载
        [self pause];
    }
}
#pragma mark---代理协议方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
    //1.拿到cache文件夹的路径
    NSString *cache=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
    //2,拿到cache文件夹和文件名
    NSString *file=[cache stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    //3.移动到下载好的文件到指定文件夹
    NSFileManager *manager=[NSFileManager defaultManager];
    [manager moveItemAtPath:location.path toPath:file error:nil];
    
}

//@optional
/* 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
{

 
//这里子类化的view 里面加载贝塞尔曲线,用匿名的类目加一个属性label,显示进度值,下面会子类化出view
    self.progressView.progress=(double)totalBytesWritten/totalBytesExpectedToWrite;
    
    //下载进度
    NSString *text=[NSString stringWithFormat:@"%.2f%%",self.progressView.progress *100];
    self.myProgressLabel.text=text;

}

/* Sent when a download has been resumed. If a download failed with an
 * error, the -userInfo dictionary of the error will contain an
 * NSURLSessionDownloadTaskResumeData key, whose value is the resume
 * data.
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes
{
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 
 
 
//3.子类化的view显示进度值和条
.h文件增加进度属性
 #import <UIKit/UIKit.h>

@interface MyProgressView : UIView
//下载进度
@property (nonatomic, assign) float progress;

@end

 
.m进度控件的实现文件
 #import "MyProgressView.h"

@interface MyProgressView ()

@property (nonatomic, strong) UILabel *label;

@end

@implementation MyProgressView

- (UILabel *)label
{
    if (_label == nil) {
        
        _label = [[UILabel alloc] initWithFrame:self.bounds];
        _label.textAlignment = NSTextAlignmentCenter;
        
        [self addSubview:_label];
    }
    
    return _label;
}
-(void)setProgress:(float )progress
{
    _progress = progress;
    
    //设置显示的文字
    self.label.text = [NSString stringWithFormat:@"%.2f%%",_progress * 100];
    //调用 drawRect:
    [self setNeedsDisplay];

}

- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    //绘制弧线
    //center -- 圆心
    //radius -- 半径
    //起始角度
    //结束角度
    //是否顺时针
    //1.圆心
    
       
    CGSize s = rect.size;
    CGPoint center = CGPointMake(s.width * 0.5, s.height * 0.5);
    //2.半径(取宽和高的小的)
    CGFloat radius = (s.width > s.height) ? s.height * 0.5 : s.width * 0.5;
    radius -= 10;
    //3.起点
    CGFloat sAngle = -M_PI_2;
    //4.终点
    CGFloat eAngle = self.progress * (2 * M_PI) + sAngle;
    UIBezierPath *path  = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:sAngle endAngle:eAngle clockwise:YES];
    
    [[UIColor yellowColor] set];//设置线条颜色
    path.lineWidth = 10;
    path.lineCapStyle = kCGLineCapRound;

[path stroke];

}

@end

这样就实现断点下载,续传功能
UI界面比较丑,基本功能已实现,一些美化图片自己美化,可以加背景图片设置更好的交互方式
截图如下
 

利用NSURLSession下载视频,图片,能实现断点续传的更多相关文章

  1. 利用python下载视频

    我们知道,有些网页上的视频,没有下载的按钮,并且有些视频需要付费下载,很多同学因此很苦恼.不怕,有问题找我,我试试用程序员的方式通俗易懂教会大家. 1.你先下载一个Python,不会下载的同学可以看这 ...

  2. 小白学Python(7)——利用Requests下载网页图片、视频

    安装 Requests 如果安装了Requests就已经可用了,否则要安装 Requests,只要在你的CMD中运行这个简单命令即可: pip install requests requests使用 ...

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

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

  4. Node.js mm131图片批量下载爬虫1.01 增加断点续传功能

    这里的断点续传不是文件下载时的断点续传,而是指在爬行页面时有时会遇到各种网络中断而从中断前的页面及其数据继续爬行的过程,这个过程和断点续传原理上相似故以此命名.我的具体做法是:在下载出现故障或是图片已 ...

  5. C#利用开源软件ffMpeg截取视频图片

    #region 从视频画面中截取一帧画面为图片 /// <summary> /// 从视频画面中截取一帧画面为图片 /// </summary> /// <param n ...

  6. 利用FFmpeg生成视频缩略图 2.1.6

    利用FFmpeg生成视频缩略图 1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/build ...

  7. C# 利用 OpenCV 进行视频捕获 (笔记)

    原文:C# 利用 OpenCV 进行视频捕获 (笔记) 简介 这个项目是关于如何从网络摄像头或者视频文件(*.AVI)中捕获视频的,这个项目是用C#和OPENCV编写的. 这将有助于那些喜欢C#和Op ...

  8. Python3——根据m3u8下载视频(上)之urllib.request

    干活干活,区区懒癌已经阻挡不了澎湃的洪荒之力了...... 运行环境:Windows基于python3.6 ---------------------------------------------- ...

  9. 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示

    在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...

随机推荐

  1. 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码

    下面是视频教程的提纲: PPT版本的提纲下载 本节源码下载 XAF框架开发教程 快速实现企业级信息系统开发的利器 XAF简介 ´  开发公司:www.devexpress.com,老牌控件公司 ´  ...

  2. github fork, star and watch

    1 git fork git clone原版本的话,只有读权限,是不能直接把修改提交到服务器的. git fork会创建一个副本,然后就可以在这个上面进行开发了,开发了之后可以通过pull reque ...

  3. libevent学习总结

    1. 信息隐藏:看*-internal.h文件 如bufferevent_private结构体在bufferevent_async.c中使用时: static inline struct buffer ...

  4. Activiti工作流(二)之常用操作

    前面介绍了Activiti工作流的基本操作,但是在实际应用过程中,往往不满足项目需求,因此还需要了解一些其他的功能比如:连线.排他网关.并行网管.流程变量.个人任务及组任务的三种发布方式. 下面将介绍 ...

  5. Asp.Net MVC学习总结(三)——过滤器你怎么看?

    一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的逻辑.提供了一个简单而优雅的方式来实现横切关注点. 2.所谓的过滤器(Filters),MVC框架里 ...

  6. 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

    JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列 ...

  7. vSphere在RedHat6.0上搭建Oracle 11g R2 RAC环境

    一.前期准备工作 1.1 为方便操作,装完系统后我们先安装Vmware Tools: 1.1.1.安装工具 在VMware的菜单栏上选择"虚拟机/安装虚拟机工具(VM/Install VMw ...

  8. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

  9. 【Ruby on Rails】Model中关于保存之前的原值和修改状态

    今天在Rails的Model中遇到了一个问题—— 当我从Model类中获取了一个ActiveRecord对象,对其进行了一系列修改(尚未保存),我该如何确定究竟哪些修改了呢? (设Model为Opti ...

  10. 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

    3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved ...