iOS开发中使用NSURLConnection类处理网络请求的方法

NSURLConnection 作为 Core Foundation / CFNetwork 框架的 API 之上的一个抽象,在 2003 年,随着第一版的 Safari 的发布就发布了。NSURLConnection 这个名字,实际上是指代的 Foundation 框架的 URL 加载系统中一系列有关联的组件:NSURLRequest、NSURLResponse、NSURLProtocol、 NSURLCache、 NSHTTPCookieStorage、NSURLCredentialStorage 以及同名类 NSURLConnection。

NSURLRequest 被传递给 NSURLConnection。被委托对象(遵守以前的非正式协议 <NSURLConnectionDelegate> 和 <NSURLConnectionDataDelegate>)异步地返回一个 NSURLResponse 以及包含服务器返回信息的 NSData。

在一个请求被发送到服务器之前,系统会先查询共享的缓存信息,然后根据策略(policy)以及可用性(availability)的不同,一个已经被缓存的响应可能会被立即返回。如果没有缓存的响应可用,则这个请求将根据我们指定的策略来缓存它的响应以便将来的请求可以使用。

在把请求发送给服务器的过程中,服务器可能会发出鉴权查询(authentication challenge),这可以由共享的 cookie 或机密存储(credential storage)来自动响应,或者由被委托对象来响应。发送中的请求也可以被注册的 NSURLProtocol 对象所拦截,以便在必要的时候无缝地改变其加载行为。

不管怎样,NSURLConnection 作为网络基础架构,已经服务了成千上万的 iOS 和 Mac OS 程序,并且做的还算相当不错。但是这些年,一些用例——尤其是在 iPhone 和 iPad 上面——已经对 NSURLConnection 的几个核心概念提出了挑战,让苹果有理由对它进行重构。

一、NSURLConnection的常用类

(1)NSURL:请求地址

(2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....

(3)NSMutableURLRequest:NSURLRequest的子类

(4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据

 

二、NSURLConnection的使用
1.简单说明
使用NSURLConnection发送请求的步骤很简单

(1)创建一个NSURL对象,设置请求路径(设置请求路径)

(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)

(3)使用NSURLConnection发送NSURLRequest(发送请求)

2.代码示例

(1)发送请求的三个步骤:

1.设置请求路径
2.创建请求对象
3.发送请求
3.1发送同步请求(一直在等待服务器返回数据,这行代码会卡住,如果服务器,没有返回数据,那么在主线程UI会卡住不能继续执行操作)有返回值
3.2发送异步请求:没有返回值
说明:任何NSURLRequest默认都是get请求。
 
(2)发送同步请求代码示例:

代码如下:

//
//  YYViewController.m
//  01-NSURLConnection的使用(GET)
//
//  Created by apple on 14-6-28.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "MBProgressHUD+MJ.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *pwd;
- (IBAction)login;

@end

代码如下:

@implementation YYViewController

- (IBAction)login {
//    1.提前的表单验证
    if (self.username.text.length==0) {
        [MBProgressHUD showError:@"请输入用户名"];
        return;
    }
    if (self.pwd.text.length==0) {
        [MBProgressHUD showError:@"请输入密码"];
        return;
    }
//    2.发送请求给服务器(带上账号和密码)
    //添加一个遮罩,禁止用户操作
//    [MBProgressHUD showMessage:@"正在努力加载中...."];
//    GET请求:请求行\请求头\请求体
//
//    1.设置请求路径
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
//    2.创建请求对象
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
//    3.发送请求
    //发送同步请求,在主线程执行
    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //(一直在等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)
    NSLog(@"--%d--",data.length);
}
@end

模拟器情况:

打印服务器返回的信息:

补充说明:
1.提前的表单验证
2.发送请求给服务器(带上账号和密码)
GET请求:请求行\请求头\请求体
注意:GET请求中不存在请求体,因为所有的信息都写在URL里面。在IOS里面,请求行和请求头都不用写。
 
(3)发送异步请求
发送异步请求有两种方式:
1)使用block回调
2)代理
A.使用block回调方法发送异步请求
使用block回调代码示例:

代码如下:

//
//  YYViewController.m
//  01-NSURLConnection的使用(GET)
//
//  Created by apple on 14-6-28.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "MBProgressHUD+MJ.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *pwd;
- (IBAction)login;

@end

代码如下:

@implementation YYViewController

- (IBAction)login {
//    1.提前的表单验证
    if (self.username.text.length==0) {
        [MBProgressHUD showError:@"请输入用户名"];
        return;
    }
    if (self.pwd.text.length==0) {
        [MBProgressHUD showError:@"请输入密码"];
        return;
    }
//    2.发送请求给服务器(带上账号和密码)
    //添加一个遮罩,禁止用户操作
    [MBProgressHUD showMessage:@"正在努力加载中...."];

//
//    1.设置请求路径
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
   
//    2.创建请求对象
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
   
//    3.发送请求
    //3.1发送同步请求,在主线程执行
//    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //(一直在等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)
   
    //3.1发送异步请求
    //创建一个队列(默认添加到该队列中的任务异步执行)
//    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    //获取一个主队列
    NSOperationQueue *queue=[NSOperationQueue mainQueue];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        NSLog(@"--block回调数据--%@---%d", [NSThread currentThread],data.length);
        //隐藏HUD,刷新UI的操作一定要放在主线程执行
        [MBProgressHUD hideHUD];
       
        //解析data
        /*
        {"success":"登录成功"}
        {"error":"用户名不存在"}
        {"error":"密码不正确"}
         */
        NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        NSLog(@"%@",dict);
       
        //判断后,在界面提示登录信息
        NSString *error=dict[@"error"];
        if (error) {
            [MBProgressHUD showError:error];
        }else
        {
            NSString *success=dict[@"success"];
            [MBProgressHUD showSuccess:success];
        }
    }];
    NSLog(@"请求发送完毕");
}
@end

模拟器情况(注意这里使用了第三方框架):

打印查看:

代码说明:
block代码段:当服务器有返回数据的时候调用会开一条新的线程去发送请求,主线程继续往下走,当拿到服务器的返回数据的数据的时候再回调block,执行block代码段。这种情况不会卡住主线程。
队列的作用:决定这个block操作放在哪个线程执行?
刷新UI界面的操作应该放在主线程执行,不能放在子线程,在子线程处理UI相关操作会出现一些莫名的问题。
提示:
(1)创建一个操作,放在NSOperation队列中执行,默认是异步执行的。
(2)mainqueue   返回一个和主线程相关的队列,即主队列。
 
新的问题:如果向服务器发送请求,却并没有拿到数据,那么程序会崩溃(data不能为空)
改进代码:

代码如下:

NSOperationQueue *queue=[NSOperationQueue mainQueue];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //当请求结束的时候调用(有两种结果,一个是成功拿到数据,也可能没有拿到数据,请求失败)
        NSLog(@"--block回调数据--%@---%d", [NSThread currentThread],data.length);
        //隐藏HUD,刷新UI的操作一定要放在主线程执行
        [MBProgressHUD hideHUD];
       
        //解析data
        /*
        {"success":"登录成功"}
        {"error":"用户名不存在"}
        {"error":"密码不正确"}
         */
        if (data) {//请求成功
            NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSLog(@"%@",dict);
           
            //判断后,在界面提示登录信息
            NSString *error=dict[@"error"];
            if (error) {
                [MBProgressHUD showError:error];
            }else
            {
                NSString *success=dict[@"success"];
                [MBProgressHUD showSuccess:success];
            }
        }else   //请求失败
        {
            [MBProgressHUD showError:@"网络繁忙,请稍后重试!"];
        }
    
    }];

解析data

代码如下:

//解析data
        /*
        {"success":"登录成功"}
        {"error":"用户名不存在"}
        {"error":"密码不正确"}
         */

说明:使用NSJSONSerialization 返回的对象,取决于最外层是什么,如果是{}那就是字典,[]那就是数组等。
补充说明:
首先确定请求路径,然后创建请求对象(默认发送的时get请求),使用异步方法(一调用这个方法,它会自动开启一个子线程去发送请求,当请求成功,数据返回的时候自动调用内部的代码段,这个代码段在那个线程执行取决于队列,如果是主队列,那么在子线程发送请求成功拿到服务器的数据后,回到主线程中解析数据,刷新UI界面)。
 
B.使用代理方法发送异步请求
要监听服务器返回的data,所以使用<NSURLConnectionDataDelegate>协议

常见大代理方法如下:

代码如下:

#pragma mark- NSURLConnectionDataDelegate代理方法

//当接收到服务器的响应(连通了服务器)时会调用

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

//当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

//当服务器的数据加载完毕时就会调用

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

//请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

使用异步方法发送get请求的代码示例:

代码如下:

//
//  YYViewController.m
//  01-NSURLConnection的使用(GET)
//
//  Created by apple on 14-6-28.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "MBProgressHUD+MJ.h"

@interface YYViewController ()<NSURLConnectionDataDelegate>
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *pwd;
@property(nonatomic,strong)NSMutableData *responseData;
- (IBAction)login;

@end

代码如下:

@implementation YYViewController

- (IBAction)login {
//    1.提前的表单验证
    if (self.username.text.length==0) {
        [MBProgressHUD showError:@"请输入用户名"];
        return;
    }
    if (self.pwd.text.length==0) {
        [MBProgressHUD showError:@"请输入密码"];
        return;
    }
//    2.发送请求给服务器(带上账号和密码)
    //添加一个遮罩,禁止用户操作
    [MBProgressHUD showMessage:@"正在努力加载中...."];

//
//   2.1设置请求路径
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
   
//   2.2创建请求对象
//    NSURLRequest *request=[NSURLRequest requestWithURL:url];//默认就是GET请求
    //设置请求超时
    NSMutableURLRequest *request=[NSMutableURLRequest  requestWithURL:url];
    request.timeoutInterval=5.0;
   
//   2.3.发送请求
 //使用代理发送异步请求(通常应用于文件下载)
    NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];
    [conn start];
    NSLog(@"已经发出请求---");
}

#pragma mark- NSURLConnectionDataDelegate代理方法
/*
 *当接收到服务器的响应(连通了服务器)时会调用
 */
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"接收到服务器的响应");
    //初始化数据
    self.responseData=[NSMutableData data];
}

/*
*当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
*/
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"接收到服务器的数据");
    //拼接数据
    [self.responseData appendData:data];
        NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]);
}

/*
 *当服务器的数据加载完毕时就会调用
 */
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"服务器的数据加载完毕");
    //隐藏HUD
    [MBProgressHUD hideHUD];
   
    //处理服务器返回的所有数据
    NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];
   
    //判断后,在界面提示登录信息
    NSString *error=dict[@"error"];
    if (error) {
        [MBProgressHUD showError:error];
    }else
    {
        NSString *success=dict[@"success"];
        [MBProgressHUD showSuccess:success];
    }
    NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]);
}
/*
 *请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
 */
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
//     NSLog(@"请求错误");
    //隐藏HUD
    [MBProgressHUD hideHUD];
    [MBProgressHUD showError:@"网络繁忙,请稍后重试!"];
}
@end

打印查看:

补充:

(1)数据的处理

在didReceiveData:方法中,拼接接收到的所有数据,等所有数据都拿到后,在connectionDidFinishLoading:方法中进行处理

(2)网络延迟

在做网络开发的时候,一定要考虑到网络延迟情况的处理,可以在服务器的代码设置一个断点模拟。

在服务器代码的登录方法中设置断点

设置请求的最大延迟

模拟器情况:

打印查看:

三、NSMutableURLRequest

NSMutableURLRequest是NSURLRequest的子类,常用方法有

设置请求超时等待时间(超过这个时间就算超时,请求失败)

代码如下:

- (void)setTimeoutInterval:(NSTimeInterval)seconds;

设置请求方法(比如GET和POST)

代码如下:

- (void)setHTTPMethod:(NSString *)method;

设置请求体

代码如下:

- (void)setHTTPBody:(NSData *)data;

设置请求头

代码如下:

- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

(0)

相关推荐

  • 微信小程序 POST请求(网络请求)详解及实例代码

    微信小程序 POST请求 微信小程序开发中网络请求必不可少.GET.POST请求是最常用的.GET请求,POST请求的时候有好几个坑.我已经为大家填好了. <img src="http://img.blog.csdn.net/20161017170933243?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Cente

  • 微信小程序网络请求的封装与填坑之路

    以前写过一篇关于微信小程序上拉加载,上拉刷新的文章,今天写的是关于小程序网络请求的封装. 在这里首先声明一个小程序文档的bug,导致大伙们在请求的时候,服务器收到不到参数的问题 示例代码: wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'Content-Type': 'application/json' }, success: function(res) { console.lo

  • Android Xutils3网络请求的封装详解及实例代码

     Xutils3网络请求的封装详解 封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出. 使用前先配置xutils3: 1.gradle中添加 compile 'org.xutils:xutils:3.3.40' 2.自定义Application /** * Created by Joe on 2016/9/25. */ public class MyApp extends Application { @Override public void onCreate(

  • 微信小程序 封装http请求实例详解

    微信小程序 封装http请求 最近看了一下微信小程序,大致翻了一下,发现跟angular很相似的,但是比angular简单的很多具体可参考官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/page.html?t=2017112 下面将封装http请求服务部分的服务以及引用部分 // 本服务用于封装请求 // 返回的是一个promisepromise var sendRrquest = function (ur

  • Android最基本的异步网络请求框架

    本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关知识.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家. 1. 同步网络请求 以HTTP的GET请求为例,我们来介绍一下Android中一个基本的同步请求框架的实现.直接贴代码: public class HttpUtils { public static byte[] get(String urlString) { HttpURLConnection urlConnec

  • 微信小程序 网络请求API详解

    wx.request(OBJECT)发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. OBJECT参数说明: 效果图: net.js Page({ data:{ result:{}, }, onLoad:function(options){ this.getDate('http://baobab.wandoujia.com/api/v2/feed?num=2'); }, /** * 网络请求的函数:接收一个URL参数 */ getDate:function(URL){ var

  • 实例讲解Python中SocketServer模块处理网络请求的用法

    SocketServer创建一个网络服务框架.它定义了类来处理TCP,UDP, UNIX streams 和UNIX datagrams上的同步网络请求. 一.Server Types 有五个不同的服务器类在SocketServer中. 1.BaseServer定义了API, 而且他不是用来实例化和直接使用的. 2.TCPServer用作TCP/IP的socket通讯. 3.UDPServer使用datagram sockets. 4.UnixStreamServer和UnixDatagramS

  • Android网络请求库android-async-http介绍

    Android网络请求库:android-async-http开源框架 之前有一篇描述了客户端请求服务器端的方式-Post的请求方式.今天介绍一个请求服务器的一个开源库-android-async-http库. 1. 概念: 这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法(匿名内部类)处理请求结果. 2. 特征: (1).处理异步Http请求,并通过匿名内部类处理回调结果 **(2).**Http异步请

  • 微信小程序 http请求封装详解及实例代码

    微信小程序  http请求封装 示例代码 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, method:'POST', header: { 'content-type': 'application/json' }, success: function(res) { console.log(res.data) }, fail: function( res ) { fail( res ); } }) 以上

  • iOS开发中使用NSURLConnection类处理网络请求的方法

    NSURLConnection 作为 Core Foundation / CFNetwork 框架的 API 之上的一个抽象,在 2003 年,随着第一版的 Safari 的发布就发布了.NSURLConnection 这个名字,实际上是指代的 Foundation 框架的 URL 加载系统中一系列有关联的组件:NSURLRequest.NSURLResponse.NSURLProtocol. NSURLCache. NSHTTPCookieStorage.NSURLCredentialStor

  • iOS开发中Swift3 监听UITextView文字改变的方法(三种方法)

    在项目中使用文本输入框出UITextField之外还会经常使用 UITextView ,难免会有需求监听UITextView文本框内文本数量.下面介绍在swift3中两种常用方式 方式一: 全局通知 1.注册通知 在合适位置注册监听UITextView文本变化的全局通知 //UITextView 监听开始输入的两种方法 //方法一:通知 NotificationCenter.default.addObserver(self, selector: #selector(ComposeVC.textV

  • iOS开发中使用CoreLocation框架处理地理编码的方法

    一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 2.在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发 (1)Map Kit :用于地图展示 (2)Core Location :用于地理定位 3.两个热门专业术语 (1)LBS :Location Based Service(基于定位的服务) (2)SoLoMo :Social Local Mobi

  • iOS开发中实现新闻图片的无限循环展示的方法

    无限轮播(新闻数据展示) 一.实现效果 二.实现步骤 1.前期准备 (1)导入数据转模型的第三方框架MJExtension (2)向项目中添加保存有"新闻"数据的plist文件 (3)导入用到的图片素材 2.步骤和代码 (1)新建一个数据模型 该模型的代码设计如下: YYnews.h文件 复制代码 代码如下: // //  YYnews.h //  08-无限滚动(新闻数据展示) // #import <Foundation/Foundation.h> @interface

  • iOS App开发中通过UIDevice类获取设备信息的方法

    UIDevice提供了多种属性.类函数及状态通知,帮助我们全方位了解设备状况.从检测电池电量到定位设备与临近感应,UIDevice所做的工作就是为应用程序提供用户及设备的一些信息.UIDevice类还能够收集关于设备的各种具体细节,例如机型及iOS版本等.其中大部分属性都对开发工作具有积极的辅助作用.下面的代码简单的使用UIDevice获取手机属性. 简单示例:设备相关信息的获取    NSString *strName = [[UIDevice currentDevice] name];   

  • 详解iOS开发中UITableview cell 顶部空白的多种设置方法

    我知道没人会主动设置这个东西,但是大家一定都遇到过这个问题,下面总结下可能是哪些情况: 1, self.automaticallyAdjustsScrollViewInsets = NO; 这个应该是最常见而且不容易被发现的原因,起因是iOS7在Conttoller中新增了automaticallyAdjustsScrollViewInsets这个属性,当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scr

  • PHP实现网络请求的方法总结

    一.分析php发送网网络请求的方法 对于php发送网络请求,我们最常用的请求就是curl,有时我们也会用到file_get_contents函数发送网络请求,但file_get_contents只能完成一些间单的网络请求,稍复杂的就无法完成,例如文件上传,cookies,验证,表单提交等,用php的curl可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及

  • IOS开发中异步网络请求上实现同步逻辑

    IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI的网络库中是有同步请求的接口,所以很好处理,AFNetwork的网络库只有异步的网络请求,该怎么实现呢? 1.循环异步拼组 - (void)uploadFile:(NSArray *)imageArray atIndex:(NSInteger)index imagesCount:(NSInteger

  • iOS开发中不合法的网络请求地址如何解决

    NSString *const kWebsite = @http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fr=&sf=1&fmq=1459502303089_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&

  • 总结iOS开发中的断点续传与实践

    前言 断点续传概述 断点续传就是从文件上次中断的地方开始重新下载或上传数据,而不是从文件开头.(本文的断点续传仅涉及下载,上传不在讨论之内)当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这样很浪费时间.所以项目中要实现大文件下载,断点续传功能就必不可少了.当然,断点续传有一种特殊的情况,就是 iOS 应用被用户 kill 掉或者应用 crash,要实现应用重启之后的断点续传.这种特殊情况是本文要解决的问题. 断点续传原理 要实现断点续传 , 服

随机推荐