从网上DownLoad

方法步骤一、storyboard布局

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDownloadDelegate>
///显示图片的
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
///显示进度的
@property (weak, nonatomic) IBOutlet UIProgressView *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.progress = 0  ;

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
#pragma mark - 开始下载
- (IBAction)startButton:(id)sender {
    NSString *urlStr = @"http://f.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=2b7d8fd27fd98d1076810435140f9438/503d269759ee3d6d505b9ee540166d224f4ade7a.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])];
    //下载请求任务
    self.task = [self.session downloadTaskWithRequest:self.request];

    //开启
    [self.task resume];

}
#pragma mark - 暂停下载
- (IBAction)pauseButton:(id)sender {
    //暂停
    if (self.task) {
        //暂停并保存之前已经下载的内容
        __weak typeof(self)weakSelf = self;
        [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
            weakSelf.data = [NSMutableData data];
        }];
    }
    [self.task suspend];
}
#pragma mark - 继续下载
- (IBAction)continueButton:(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 {
    //找到文件夹管理器

    NSFileManager *fileManager = [NSFileManager defaultManager];

    //先找到沙盒
    NSArray *urlArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];

    //根据沙盒路径获取Document路径

    NSURL *url = [urlArray objectAtIndex:0];
    NSLog(@"url=====%@",url);

//    response.suggestedFilename:建议使用的文件名,一般根服务端的文件名一致

    NSURL *saveUrl = [url URLByAppendingPathComponent:downloadTask.response.suggestedFilename];

    NSLog(@"sabrUrl -------%@",saveUrl);
    //location:临时文件的路径(下载好的文件)
    //AtPath:剪切前的文件路径 //ToPath:剪切后的文件路径
    [fileManager moveItemAtPath:location.path toPath:saveUrl.path error:nil];
    self.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:saveUrl]];

}

#pragma mark - 下载完,部分就会调用(可能被调用多次)

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

    //下载当前段的数据
    NSLog(@"bytesWrite = %lld",bytesWritten);
    NSLog(@"totalytesWritten = %lld",totalBytesWritten);
    NSLog(@"titalBytesExpectedToWrite = %lld",totalBytesExpectedToWrite);

    self.progressView.progress = (CGFloat)totalBytesWritten /(CGFloat)totalBytesExpectedToWrite;

    NSLog(@"%f",self.progressView.progress);
}

@end

时间: 2024-12-23 10:02:23

从网上DownLoad的相关文章

Android 5.0源码编译问题

转载: http://blog.csdn.net/shineflowers/article/details/41545057 如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是从别人那拷贝,然后自己编译,那么通常会出现下面的错误: No rule to make target 'external/chromium_org/third_party/a

cobbler批量安装服务器

1,安装epel 手动安装(https://fedoraproject.org/wiki/EPEL) wget http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm rpm -Uvh /root/Desktop/epel-release-7-9.noarch.rpm 2,安装cobbler以及相关包 yum -y install cobbler httpd xinetd tftp-ser

android之网络操作(1)

一.网络操作 在网络操作中JAVA已经为我提供了一套API用来进行网络操作,在android开发中我们仍可以这套API来做开发.下面通过一个简单的例子来了解一下android下的网络操作. 点击图中下载按钮从服务器上下载一张图片下来 二.xml布局文件 布局文件采用线性布局,只使用到一个button和一个image <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

pyQt5新手教程 (一)通过anaconda安装pyqt包

为什么要学pyqt 你想不想开发一个基于桌面的GUI程序,让你的同事和家人刮目相看,你总是看完这个看那个,却始终不得入门,来这里吧!很多教程不适合你,难度太难,没人教,来这里吧! 为什么不是tkinter,当你下载了基于python的tkinter,写一个小程序的时候你就知道为什么要用了,比如下面这个几乎什么都没有的框子,要花30多行,让人写的云里雾里的 那和pyqt有什么关系? 因为python很好学,我需要找和python相关的GUI编程ide 怎么学pyqt,跟这我学呗!!  还有人问为什

解决项目中的跨域操作问题

浏览器存在许多安全策略,其中同源策略就是其中一个,所谓同源策略也叫同域名策略,即只有协议+域名+端口一致的情况下才可以相互访问,其目的就是为了保护用户信息的安全,同源策略现在的范围包括三方面:1).Cookie.LocalStorage.IndexDB无法读取:2).DOM无法获取:3).AJAX请求不能发送.这里主要介绍两种解决AJAX请求不能发送的解决方案:JSONP和CORS.JSONP是一种前端的解决方式:CORS是跨域资源共享,在服务端实现. 一.JSONP 这里使用jquery的$.

怎么修改电脑MAC地址 电脑MAC地址修改图文教程

本文转载:http://www.45fan.com/a/Router/2677.html MAC地址是指电脑网卡的硬件地址,此地址一般烧录在网卡上.MAC地址工作在OSI七层模型的第二层,即数据链接层.那MAC地址可以修改吗?MAC地址一般在什么环境下需要修改? 这也是咱们今天讨论的主题,针对这两个问题,咱一个个来讨论:MAC地址可以修改吗?回答是肯定的,现在一般网卡MAC地址修改都通过软件来完成,但除了软件修改方式,本机同样可以修改.另外,MAC地址需要修改一般当在局域网绑定时才会用到,比如局

maven学习(中)- 私服nexus搭建

接上回继续,相信大家对maven每次都联网从国外站点下载依赖项的龟速网络已经不坎忍受了,今天先来看看如何搭建"仓库私服",目前nexus是使用比较广泛的私服软件之一,下面将介绍基本用法: 一.到nexus官网下载最新版 1.1 下载地址:http://www.sonatype.org/downloads/nexus-latest-bundle.zip (目前最新版本是2.7.2-03) (2015-07-02注: 上面的下载地址好象已经失效了,新的地址为 http://www.sona

Eclipse出现&quot;错误: 找不到或无法加载主类&quot;的情况

在一个工程下创建一个源文件然后进行将从网上download的代码复制运行的时候出现了"错误: 找不到或无法加载主类 "错误: 找不到或无法加载主类 "的情况,整个项目使用maven构建的,然后试着运行相同package下的已经存在的源文件,发现可以运行,但是将该文件的目标文件(编译好的文件)删除之后再次运行同样出现这个问题,这应该说明当前package下的所有文件都出现问题了. 点开该工程的"Build Path"然后进行Configure发现这个pack

Linux 判断Cacti模板的版本

经常有人在 import从网上download的cacti template时发生"Error: XML: Hash version does not exist" 错误. 这是因为 export template的cacti和import template的cacti的版本不同引起的.为了保证兼容性,cacti有一个机制会阻止从新版本cacti导出的模板被导回到旧版本的cacti 中. 那么如何判断一个模板所使用的cacti版本呢?方法是查看template中的hash后边的字符串的