ios之NSURLSessionDownloadTask下载

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDownloadDelegate,NSURLSessionDownloadDelegate>
///显示图片的
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
///显示进度的
@property (weak, nonatomic) IBOutlet UISlider *progressView;
///下载任务的属性
@property (nonatomic,strong)NSURLSessionDownloadTask *task;
///网络请求类
@property
(nonatomic,strong)NSURLSession *session;

///发送请求类
@property(nonatomic,strong)NSURLRequest *request;
///用于保存已经下载的数据的,供继续下载使用

@property (nonatomic,strong)NSMutableData *data;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //
    self.progressView.value = 0;
}
#pragma mark - 开始下载
- (IBAction)startDownLoad:(id)sender {

    NSString *urlStr = @"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1464602004&di=2f52d829b167189d005b506a96fbd87e&src=http://imgsrc.baidu.com/forum/pic/item/b15db8a1cd11728b829819d0c8fcc3cec2fd2c6c.jpg";
    NSURL *url = [NSURL URLWithString:urlStr];
    //初始化请求
    self.request = [NSURLRequest requestWithURL:url];
    //创建NSURLSession
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//    NSURLSessionTask *task = [session dataTaskWithRequest:self.request];

    //下载请求任务
    self.task = [self.session downloadTaskWithRequest:self.request];

    //开启
    [_task resume];

}
#pragma mark - 暂停下载
- (IBAction)pauseDownLoad:(id)sender {
    //暂停
    if (self.task ) {
        //暂停并保存之前已经下载的内容
        __weak typeof(self)weakSelf = self;
        [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
            weakSelf.data = [NSMutableData dataWithData:resumeData];

        }];

    }
    //暂停任务
    [_task suspend];
}
#pragma mark - 继续下载
- (IBAction)continueDownLoad:(id)sender {
    //判断当前任务是否有,是发送请求还是处理数据
    if (self.task != nil) {
        //说明已经下载,这里要处理的就是数据
        self.task = [self.session downloadTaskWithResumeData:self.data];
    } else {
        //此时没有下载任何内容,应该重新发送请求进行下载
        self.task = [self.session downloadTaskWithRequest:self.request];
    }
    //启动
    [self.task resume];
}

#pragma mark - 代理方法
//下载完成走的方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    NSLog(@"%@",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];

    }
    //让documents文件也有一份下载的文件
    [fileManager moveItemAtURL:location toURL:fileURL error:NULL];
    self.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:fileURL]];
    NSLog(@"%@",fileURL);
}
//下载中
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    //下载当前段的数据
    NSLog(@"bytesWritten=%lld",bytesWritten);
    //已经下载的总数据量
    NSLog(@"totalBytesWritten=%lld",totalBytesWritten);
    //总进度
    NSLog(@"totalBytesExpectedToWrite=%lld",totalBytesExpectedToWrite);
    //设置progressView的进度值
    self.progressView.value = (CGFloat)totalBytesWritten/(CGFloat)totalBytesExpectedToWrite;
}

@end

运行结果如图:

时间: 2024-10-06 15:10:01

ios之NSURLSessionDownloadTask下载的相关文章

iOS学习-10下载(2)NSURLSession 篇

使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // ViewController.m // NSURLSession // // Copyright © 2016年 asamu. All rights reserved. // #import "ViewController.h" @interface ViewController () @e

iOS多图片下载

iOS多图片下载.在cell里面下载图片.做了缓存优化. (app.icon是图片地址) // 先从内存缓存中取出图片 UIImage *image = self.images[app.icon]; if (image) { // 内存中有图片 cell.imageView.image = image; } else { // 内存中没有图片 // 获得Library/Caches文件夹 NSString *cachesPath = [NSSearchPathForDirectoriesInDo

iOS教程:详解iOS多图下载的缓存机制

ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cell里显示一张图片,而且这些图片都需要从网上下载. 2. 容易遇到的问题 如果不知道或不使用异步操作和缓存机制,那么写出来的代码很可能会是这样: cell.textLabel.text = app.name; cell.detailTextLabel.text = app.download;NSDat

李洪强iOS开发之下载

// // //  LHQDownLoader.m //  A21 - 李洪强 - 下载 // //  Created by vic fan on 16/7/3. //  Copyright © 2016年 李洪强. All rights reserved. // #import "LHQDownLoader.h" @interface LHQDownLoader ()<NSURLSessionDataDelegate> @end @implementation LHQDo

Jellycons – iOS 8 图标下载(PNG, SKETCH)

Jellycons 这套由 LoveUI.co 设计图标包括30款扁平化,圆滑,丰富多彩的 iOS 8 应用程序图标,可以用于于个人和商业项目的使用.另外,PNG 格式包含11种尺寸(1024px, 512px, 152px, 180px, 120px, 87px, 80px, 76px, 58px, 40px, 29px),支持 iPhone 6 和 iPhone 6 Plus. 立即去下载(貌似要FQ) 您可能感兴趣的相关文章 Web 开发中很实用的10个效果[源码下载] 精心挑选的优秀jQ

【iOS开发-6】iOS框架以及手册的在线阅读和PDF版本的iOS Technology Overview下载

看一下官方文档,就可知:iOS框架就是iOS开发的整个技术,只不过apple把所以的技术都分类封装到不同的框架里面,便于需要的人调用. 当然,至于iOS框架从底层到顶层分为Core OS.Core Services.Media.Cocoa Touch四个层,可以简单理解成把那么多框架分成四个类而已. (1)iOS框架大概介绍 iOS的开发框架有很多,差不多71个,两年前只有40个左右,可以预见只会越来越多. 但是常用的也就十几个,比如CFNetwork.Foundation.UIKit这些,而诸

iOS网络数据下载和JSON解析

iOS网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection如何从网络中下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载显示. 涉及到的知识点: 1.NSURLConnection异步下载和封装 #import "ZJHttpRequest.h" //消除performSelector的警告 #pragma clang diagnostic ignored "-Warc-performSelec

ios 网络数据下载和JSON解析

ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载显示 涉及到得知识: 1.NSURLConnection异步下载和封装 2.JSON格式和JSON格式解析 3.数据显示和使用SDWebImage异步显示图片 内容 1.网络下载基础知识介绍 (1)什么是网络应用? 一般情况下, iPhone的计算机, 照相机不需要从网络上下载数据也能运行, 所以这

ios字体动态下载

一.IOS字体 动态下载字体,不仅可以减少APP包的大小,而且字体在iOS系统中是公共的,可共用的.所以如果自己用到的字体已经下载字体,就不用再次下载.还有就是系统提供的字体是iOS维护的.如果用到第三方字体,不仅字体大小对流量.包大小有影响,而且会有版权等的诸多限制.真机下载后的字体路径是在 file:///private/var/MobileAsset/Assets/com_apple_MobileAsset_Font2/25eb7390708d494864eef0905635e1dc3f2