数据存储之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),不能存储自定义的 ...
随机推荐
- vmware上搭建kickstart 网络安装centos6.2的过程
前言 什么是PXE? PXE(Pre-boot Execution Environment,预启动执行环境)协议使计算机可以通过网络启动.协议分client和server. PXE client 在网 ...
- VC无闪烁刷屏技术的实现【转】
转自:http://blog.csdn.net/scorpio_tiger/article/details/2888719 http://www.pconline.com.cn/pcedu/empol ...
- 新建module---获取带宽信息
借鉴自http://blog.csdn.net/xjtuse2014/article/details/53968726 1.MoniterBandwidth模块: package net.floodl ...
- POCO库中文编程参考指南(5)Poco::Net::SocketAddress
1 枚举 最大地址长度,这个与Poco::Net::IPAddress中的定义可以类比,不过这里指的是`struct sockaddr_in6 enum { MAX_ADDRESS_LENGTH = ...
- Kubernetes控制节点安装配置
#环境安装Centos 7 Linux release 7.3.1611网络: 互通配置主机名设置各个服务器的主机名hosts#查找kubernetes支持的docker版本Kubernetes v1 ...
- 1.Openstack-环境安装
Centos7 OpenStack环境安装 Ifcofnig vim命令 Centos7最小化安装后如没有ifconfig vim命令,执行: 1 yum install -y net-tools v ...
- 本地yum仓库的搭建
. 1.直接断开网络,模拟生产内网环境 2.将原先的网络yum仓库全部移动到 backup目录下 3.创建本地yum仓库 local_yum.repo vi /etc/yum.repos.d/loc ...
- 二十六个月Android学习工作总结【转】
原文:二十六个月Android学习工作总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍. 2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该 ...
- [BZOJ4756][Usaco2017 Jan]Promotion Counting 树状数组
4756: [Usaco2017 Jan]Promotion Counting Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 305 Solved: ...
- uva12265 贩卖土地 单调栈
输入一个n*m的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 输入包含多组测试数据,第一行输入一个正整数N,表示输入样例 ...