• iOS里面实现断点续传
  • 第三方框架之AFN
  • 代码实现

一、iOS里面实现断点续传

1⃣️AFN基于NSURL
1.性能和稳定性略差。针对JSON、XML、Plist和Image四种数据结构封装了各自处理器
2.适合逻辑简单的应用,易用性好
2⃣️ASI基于CFNetwork(更底层)
1.性能和稳定性略高,没有针对任何一种数据类型做封装
2.适合已经发展了一段时间的应用

二、第三方框架AFN
1⃣️操作
1.拖入AFN框架文件,编译(两个警告,需要倒入框架)
2.倒入System~, Mobile~
3.Supporting File文件修改.pch文件,#import一下上面两个框架
2⃣️步骤
  1. 指定下载文件地址
  2. 指定文件保存路径
  3. 创建NSURLRequest
  4. 创建AFURLConnectionOperation
  5. 设置操作的输入流(网络上数据是以输入的形式传输)
  6. 设置下载进程处理块代码
  7. 操作完成块代码
  8. 启动操作

三、代码实现
#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断点续传的更多相关文章

  1. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  2. 【iOS-Android开发对照】之 数据存储

    [iOS-Android开发对照]之 数据存储 写在前面的话 相比Android和iOS,我认为Android的数据存储更开放一些.Android天生就能够使用多Java I/O:并且天生开放的特性, ...

  3. 【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)

    http://blog.csdn.net/pleasecallmewhy/article/details/8543181 在Unity中的数据存储和iOS中字典的存储基本相同,是通过关键字实现数据存储 ...

  4. iOS笔记———数据存储

    应用沙盒:应用文件系统的根目录,每个应用都有独自的沙盒相互:在xcode中可以用NSHomeDirectory()函数,打印当前应用的沙盒根路径. 应用程序包:包含了所有资源文件和执行文件; * Do ...

  5. IOS数据存储之Sqlite数据库

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发 ...

  6. IOS数据存储之文件沙盒存储

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...

  7. iOS 应用数据存储方式(XML属性列表-plist)

    iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...

  8. iOS开发 - OC - 实现本地数据存储的几种方式一

    iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...

  9. ios中常见数据存储方式以及SQLite常用的语句

    在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults  将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...

随机推荐

  1. off charging mode flow

    /system/core/init/init.cpp ..... ..... ..... int main(int argc, char** argv) { ..... ..... ..... // ...

  2. Sublime Text 3 使用技巧,插件

    一.安装 官网下载最新版安装包,地址自行百度,或者我的网盘 不要安装某些网站提供的安装包*3,原因如下: 1,安装过程捆绑一些不必要的软件 2,测试过程中,某些功能受到限制 快捷键大全 3,一些设置, ...

  3. SpringMVC + Hibernate + MySQL 的简易网页搭建(Dao层 实现篇)

    首先在搭建一个网站后台前,需要明确出一个合理的网页搭建的结构框架,即从DB  ==>  Dao层 ==>Service层 ==>Control层 ==>View层(该层严格意义 ...

  4. socket 和 webservice 的区别和比较

    时间紧迫,我就直奔主题. 目前需要说服客户使用webservice 而不是socket. 我觉得要先分别解释下什么是socket 什么是webservice..这个要我该怎么说才比较形象,让人一定就明 ...

  5. [BZOJ4398]福慧双修/[BZOJ2407]探险

    题目大意: 给定一个$n(n\leq40000)$个点$m(m\leq100000)$条边的有向图,求从$1$出发回到$1$的不经过重复结点的最短路. 思路: 首先Dijkstra求出从1出发到每个结 ...

  6. Oracle数据库任何用户密码都能以sysdba角色登入

    * 本文相关环境:Windows 10,64位操作系统:Oracle 11gR2:toad for Oracle12.1 最近在学习Oracle数据库,使用Toad for Oracle来查看数据库的 ...

  7. MySQL 中的 base64 函数

    1. 5.6版本及之后的版本的base64 主要就是两个mysql内部函数to_base64和from_base64,使用也很简单,如下: 5.6之前不支持 mysql> select vers ...

  8. mac下eclipse导入windows项目文件乱码

    右键property->resource没有GBK,手工输入"GBK"项目正常. 一开始用windows被坑了,如果再用windows平台,第一时间将encoding改成UT ...

  9. /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux)

    /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux) /usr/bin/ld: /usr/local/lib/lib ...

  10. Ubuntu 16.04没有/etc/default/rcS文件的UTC设置选项的问题解决

    继续上一篇文章介绍了CentOS的时钟设置:http://www.cnblogs.com/EasonJim/p/8111747.html,大致的知道了BIOS在Linux的时区设置. 而现在关心的问题 ...