数据存储之iOS断点续传
- iOS里面实现断点续传
- 第三方框架之AFN
- 代码实现
一、iOS里面实现断点续传
二、第三方框架AFN
- 指定下载文件地址
- 指定文件保存路径
- 创建NSURLRequest
- 创建AFURLConnectionOperation
- 设置操作的输入流(网络上数据是以输入的形式传输)
- 设置下载进程处理块代码
- 操作完成块代码
- 启动操作
三、代码实现
#pragma mark - 下载文件
- (IBAction)downloadFiles:(id)sender
{
// 1. 指定下载文件地址
NSURL *url = [NSURL URLWithString:@"http://169.254.98.245/download/iTunesConnect_DeveloperGuide_CN.zip"];
// 2. 指定文件保存路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *downloadPath = [documents[]stringByAppendingPathComponent:@"book.zip"];
// 3. 创建NSURLRequest
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 4. 创建AFURLConnectionOperation
AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; // 5. 设置操作的输出流(在网络中的数据是以流的方式传输的,告诉操作把文件保存在第2步设置的路径中)
[operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:downloadPath append:NO]];
// 6. 设置下载进程处理块代码
// 6.1 bytesRead 读取的字节——这一次下载的字节数
// 6.2 totalBytesRead 读取的总字节——已经下载完的
// 6.3 totalBytesExpectedToRead 希望读取的总字节——就是文件的总大小
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
// 做下载进度百分比的工作
NSLog(@"下载百分比:%f", (float)totalBytesRead / totalBytesExpectedToRead);
}];
// 7. 操作完成块代码
[operation setCompletionBlock:^{
// 解压缩的顺序
// 1. 定义要解压缩的文件 —— downloadPath
// 2. 要解压缩的目标目录
// 3. 调用类方法解压缩
[SSZipArchive unzipFileAtPath:downloadPath toDestination:documents[]]; // 删除压缩包
[[NSFileManager defaultManager]removeItemAtPath:downloadPath error:nil];
}]; // 8 启动操作
[operation start];
}
常用方法实现
//
// ViewController.m
// AFN框架
//
// Created by apple on 14-6-21.
// Copyright (c) 2014年 Early. All rights reserved.
// #import "ViewController.h"
#import "AFNetworking.h" @interface ViewController () <NSXMLParserDelegate>
{
NSOperationQueue *_queue; UIImageView *_imageView;
}
@end @implementation ViewController /**
1.在Linux系统上,运行的Web服务器叫做Apache
2.所有的http访问都是基于html或者相关的文件,例如:php,asp,jsp,asp.net
3.form,在html页面中又称表单,用来提交页面的,所有post请求的页面,至少会有一个表单
4.get/post,get是拿数据,post是将数据体放置在表单中提交给服务器,然后服务器再响应
*/ - (void)viewDidLoad
{
[super viewDidLoad]; _queue = [[NSOperationQueue alloc] init]; //1.检测连接状态
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(, , , );
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn setTitle:@"链接状态" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(reach) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn]; //2.JSON解析
UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
btn2.frame = CGRectMake(, , , );
[btn2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn2 setTitle:@"加载JSON" forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(loadJSON) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn2]; //3.XML解析
UIButton *btn3 = [UIButton buttonWithType:UIButtonTypeCustom];
btn3.frame = CGRectMake(, , , );
[btn3 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn3 setTitle:@"加载XML" forState:UIControlStateNormal];
[btn3 addTarget:self action:@selector(loadXML) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn3]; //4.UIImageView
UIButton *btn4 = [UIButton buttonWithType:UIButtonTypeCustom];
btn4.frame = CGRectMake(, , , );
[btn4 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn4 setTitle:@"加载UIImageView" forState:UIControlStateNormal];
[btn4 addTarget:self action:@selector(loadImageView) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn4]; //5.上传文件
UIButton *btn5 = [UIButton buttonWithType:UIButtonTypeCustom];
btn5.frame = CGRectMake(, , , );
[btn5 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn5 setTitle:@"上传图像" forState:UIControlStateNormal];
[btn5 addTarget:self action:@selector(postImage) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn5];
//6.断点续传
} #pragma mark - 上传图像
- (void)postImage
{
//1.定义HttpClient
NSURL *url = [NSURL URLWithString:@"地址"];
AFHTTPClient *httpClient = [AFHTTPClient clientWithBaseURL:url]; //baseUrl后边的请求都基于这个地址 //2.根据HttpClient生成一个post请求
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"后续地址" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//formData就是上传的数据
NSData *data = UIImagePNGRepresentation(_imageView.image);
/**
1.要上传文件的参数
2.负责上传文件的远处服务中接受文件使用的参数
3.要上传文件的文件名(别人告知)
4.要上传文件的文件类型(别人告知)
*/
[formData appendPartWithFileData:data name:@"file" fileName:@"upload001.png" mimeType:@"image/png"];
}]; //3.准备做上传的操作
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"上传文件成功");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"上传文件失败");
}]; [op start];
} #pragma mark - 加载UIImageView
//如果异步在家表格图像,不建议使用
- (void)loadImageView
{
//1.创建一个UIImageView
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(, , , )];
[self.view addSubview:_imageView]; //2.URL
NSURL *url = [NSURL URLWithString:@"图片地址"];
[_imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@""]];
} #pragma mark - 加载XML
- (void)loadXML
{
//1.URL
NSURL *url = [NSURL URLWithString:@"地址"]; //2.Request
NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.Connection(默认在主队列,可以新建一个队列放入,不影响主界面)
AFXMLRequestOperation *op = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
NSLog(@"加载XML成功"); //1.实例化解析器,并传入数据 AFN已经做了 XMLParser
//2.设置代理
[XMLParser setDelegate:self];
//3.解析器解析
[XMLParser parse]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
NSLog(@"加载XML失败");
}]; [_queue addOperation:op];
}
#pragma mark - XML解析器代理方法(6个)
- (void)parserDidEndDocument:(NSXMLParser *)parser
{ } #pragma mark - 加载JSON
- (void)loadJSON
{
//1.URL
NSURL *url = [NSURL URLWithString:@"地址"]; //2.Request
NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.Connection(默认在主队列,可以新建一个队列放入,不影响主界面)
AFJSONRequestOperation *op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"成功加载JSON");
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"失败加载JSON");
}]; [op start];
} #pragma mark - 检测连接状态
- (void)reach
{
//链接状态的检测
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
AFHTTPClient *httpClient = [AFHTTPClient clientWithBaseURL:url]; [httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"无链接");
break; case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"Wifi");
break; case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G链接");
break; default:
NSLog(@"链接状态未知");
break;
}
}];
} @end
数据存储之iOS断点续传的更多相关文章
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
- 【iOS-Android开发对照】之 数据存储
[iOS-Android开发对照]之 数据存储 写在前面的话 相比Android和iOS,我认为Android的数据存储更开放一些.Android天生就能够使用多Java I/O:并且天生开放的特性, ...
- 【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)
http://blog.csdn.net/pleasecallmewhy/article/details/8543181 在Unity中的数据存储和iOS中字典的存储基本相同,是通过关键字实现数据存储 ...
- iOS笔记———数据存储
应用沙盒:应用文件系统的根目录,每个应用都有独自的沙盒相互:在xcode中可以用NSHomeDirectory()函数,打印当前应用的沙盒根路径. 应用程序包:包含了所有资源文件和执行文件; * Do ...
- IOS数据存储之Sqlite数据库
前言: 之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发 ...
- IOS数据存储之文件沙盒存储
前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...
- iOS 应用数据存储方式(XML属性列表-plist)
iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...
- iOS开发 - OC - 实现本地数据存储的几种方式一
iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...
- ios中常见数据存储方式以及SQLite常用的语句
在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults 将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...
随机推荐
- UVA 10519 !! Really Strange !!
//ans=2*n+(n-1)(n-2) n>=2#include <map> #include <set> #include <list> #include ...
- C语言字节对齐问题详解【转】
引言 转自:http://www.cnblogs.com/clover-toeic/p/3853132.html 考虑下面的结构体定义: 1 typedef struct{ 2 char c1; 3 ...
- kubernetes 搭建集群内服务
nginx-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: webapp spec: replicas: 2 te ...
- OpenStack基础概念
openstack 组件介绍 1.horizon -- UI模块 为云管理提供整体视图,以实现资源整合和管理配额 为终端用户提供自动服务门户,在自由范围内自由操作,使用资源 2.keystone -- ...
- maven构建的模块化的JavaWeb工程
最近对maven构建的模块化的JavaWeb工程,比较感兴趣,所以自己就想从头弄一个出来,在此做一个记录,供以后学习. 前置条件:电脑上有eclipse(或者myeclipse,记事本也可以,那样就得 ...
- 计蒜客 28317.Growling Gears-一元二次方程的顶点公式 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 G)
G. Growling Gears 传送门 此题为签到题,直接中学的数学知识点,一元二次方程的顶点公式(-b/2*a,(4*a*c-b*b)/4*a):直接就可以得到结果. 代码: #include& ...
- RQNOJ PID217 / [NOIP1999]拦截导弹【n^2 / LIS】
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- 洛谷 P1064 金明的预算方案【有依赖的分组背包】
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...
- Codeforces Round #445 B. Vlad and Cafes【时间轴】
B. Vlad and Cafes time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...