数据存储之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),不能存储自定义的 ...
随机推荐
- linux 内存查看方法:meminfo\maps\smaps\status 文件解析
linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍 ...
- 5.DataFrame(基本概念)
- ajax和json数据
一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应, ...
- poj 2546(两圆公共面积)
Circular Area Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5682 Accepted: 2225 Des ...
- 来杯咖啡-装饰者模式(Decorator)
前言 上篇[观察者模式]发布已经近一个月了,个人感觉反应并不太理想,因为大家响应都不是很积极,不知是文章那里写得有问题,而且也没有人提出过有价值的改进建议,多少感觉有些失望L!因为工作繁忙,所以不可能 ...
- 华农oj 2192: hzk又在打人【CRT合并/待补】
2192: hzk又在打人 Time Limit: 12 Sec Memory Limit: 512 MB Submit: 52 Solved: 1 [Submit][Status][Web Boar ...
- springmvc适配器的应用
前言 关于SpringMVC初始化ContextLoader中的XMLWebApplicationContext,以及DispatcherServlet初始化等等,这样的原理 已经有 ...
- Linux Shell 参数传递多种方式
背景 最近编写ansible脚本,需要自动调用之前写好的shell脚本,由于shell脚本中包含了read命令接收用户的手动输入,为了实现ansible脚本的自动运行,不得不将手动输入转换为自动输入. ...
- Qt如何学习(参考官方文档)
Designers who are familiar with web development can start with QML 一共有四种安装工具 You have following opti ...
- lock参数变化吗
多线程应用中经常使用lock,在使用这个关键字的时候,经常有个疑问,如果更改了当时的入参,那么是否会变化呢,下面通过代码实例测试一把 class Program { static void Main( ...