本人视频教程系列

导入AFNetworking 2.0 文件夹,引入头文件AFNetworking.h

---------------

*使用NSURLSessionDownloadTask来下载一张图片,并带有下载进度(以下两段代码是一起的,注意)

NSProgress为iOS7新增加的类

    // 定义一个progress指针
NSProgress *progress; // 创建一个URL链接
NSURL *url = [NSURL URLWithString:\
@"http://wallpapers.wallbase.cc/rozne/wallpaper-3020771.jpg"]; // 初始化一个请求
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 获取一个Session管理器
AFHTTPSessionManager *session = [AFHTTPSessionManager manager]; // 开始下载任务
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response)
{
// 拼接一个文件夹路径
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; // 根据网址信息拼接成一个完整的文件存储路径并返回给block
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error)
{
// 结束后移除掉这个progress
[progress removeObserver:self
forKeyPath:@"fractionCompleted"
context:NULL];
}]; // 设置这个progress的唯一标示符
[progress setUserInfoObject:@"someThing" forKey:@"Y.X."];
[downloadTask resume]; // 给这个progress添加监听任务
[progress addObserver:self
forKeyPath:@"fractionCompleted"
options:NSKeyValueObservingOptionNew
context:NULL];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) {
NSProgress *progress = (NSProgress *)object;
NSLog(@"Progress is %f", progress.fractionCompleted); // 打印这个唯一标示符
NSLog(@"%@", progress.userInfo);
}
}

*使用AFHTTPRequestOperation下载图片的操作,不过,没有进度显示(源码中也没有相关方法-_-!)

    // 组织一个请求
NSURLRequest *request = \
[NSURLRequest requestWithURL:\
[NSURL URLWithString:@"https://images0.cnblogs.com/i/607542/201404/050759358125578.png"]]; // 建立请求操作
AFHTTPRequestOperation *requestOperation = \
[[AFHTTPRequestOperation alloc] initWithRequest:request]; // 进行操作的配置(下载图片,还有其他的类型)
requestOperation.responseSerializer = [AFImageResponseSerializer serializer]; // 设置获取数据的block
[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
// 源码中为并发线程池返回了主线程
NSLog(@"Response: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
// 源码中为并发线程池返回了主线程
NSLog(@"Image error: %@", error);
}]; // 开始执行
[requestOperation start];

*下载队列,且能在后台下载,关闭了应用后还继续下载(这个功能好^_^)

Upload and download tasks in background sessions are performed by an external daemon instead of by the app itself. As a result, the transfers continue in the background even if the app is suspended, exits, or crashes.

在后台进行上传或者下载任务的会话,是被系统的程序管理而不是应用本身来管理的.所以呢,当app挂了,推出了甚至崩溃了,这个下载还是继续着的

@interface DownloadsViewController ()

{
AFURLSessionManager *manager;
} @end
    // 配置后台下载会话配置
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"downloads"]; // 初始化SessionManager管理器
manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; // 获取添加到该SessionManager管理器中的下载任务
NSArray *downloadTasks = [manager downloadTasks]; // 如果有下载任务
if (downloadTasks.count)
{
NSLog(@"downloadTasks: %@", downloadTasks); // 继续全部的下载链接
for (NSURLSessionDownloadTask *downloadTask in downloadTasks)
{
[downloadTask resume];
}
}

按按钮添加一个下载任务到manager中

- (void)addDownloadTask:(id)sender
{
// 组织URL
NSURL *URL = [NSURL URLWithString:@"http://pic.cnitblog.com/avatar/607542/20140226182241.png"]; // 组织请求
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; // 给SessionManager管理器添加一个下载任务
NSURLSessionDownloadTask *downloadTask = \
[manager downloadTaskWithRequest:request
progress:nil
destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]];
return [documentsDirectoryPath URLByAppendingPathComponent:[targetPath lastPathComponent]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume]; // 打印下载的标示
NSLog(@"%d", downloadTask.taskIdentifier);
}

最新文章

  1. 跟着百度学PHP[4]OOP面对对象编程-12-对象接口技术(interface)
  2. tomcat servlet 线程
  3. MyBatis之三:多表联合查询
  4. bzoj1084
  5. puppet yum安装配置,简单证书维护
  6. C++头文件#include<bits/stdc++.h>
  7. Java web开发中页面跳转小技巧——跳转后新页面在新窗口打开
  8. 工作时间看股票:采用Excel RTD技术获取和讯网的实时股票行情及深沪港最新指数
  9. redis源码之压缩列表ziplist
  10. ThreadException
  11. 【JavaFx教程】第一部分:Scene Builder
  12. shell 命令总结
  13. elimination-game
  14. kinect相机做扫描仪扫描人体模型
  15. js cookies的使用及介绍 (非常详细)
  16. LCA离线算法Tarjan的模板
  17. Jquery 获取地址位置
  18. Custom Email Attribute在客户端不起作用原因
  19. Centos6安装SGE以及集群配置
  20. python object与dict互相转换

热门文章

  1. git clone 某个分支或者所有分支
  2. BCD码
  3. 2018 ACM-ICPC, Syrian Collegiate Programming Contest F - Pretests SOS dp
  4. bzoj 1218: [HNOI2003]激光炸弹
  5. autoit v3安装
  6. 备份恢复-----system表空间损坏
  7. synchoronized和lock区别
  8. (五)静态断言(下),static_assert
  9. 重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor
  10. BZOJ 2959: 长跑 lct 双联通分量 并查集 splay