ASIHTTPRequest系列(一):同步和异步请求

发表于8个月前(2013-11-27 19:21)   阅读(431) | 评论(0) 6人收藏此文章, 我要收藏
赞0

ASIHTTPRequest提供如下功能:
1、提交数据到web服务器或者从web服务器获得数据;
2、下载数据到内存或磁盘;
3、采用html input相同的机制上传文件;
4、断点续传;
5、简单存取HTTP头;
6、上传/下载进度显示;
7、支持Cookie;
8、后台运行(iOS4.0以上支持);
9、对于请求和响应的GZIP支持;
10、支持客户端证书;
11、支持同步/异步请求;
......

关于它的介绍网上已经有很多了,该项目有很详细的指南文档:How to use ASIHTTPRequest,也有网友翻译成中文了。本文没有完全照搬官方文档的内容,而是着重介绍了几个常见的应用,并涵盖了一些自己的理解和实际应用经验,包括:
安装、简单异步/同步请求、队列请求、上传、下载及 Cookies
    注意,虽然这些技术在本文中是分开讲述的,但在实际工作中,往往是多种技术结合应用的。
    此外,Http请求往往伴随着XML技术的应用,实际上ASIHTTPRequest是可以和SAX异步解析结合应用的,这部分内容请参考ASIHTTPRequest和libxml结合,实现边请求边解析》

项目下载地址: http://github.com/pokeb/asi-http-request/tarball/master
    解压缩并打开文件夹,其中包括:
        1、一个iPhone Xcode项目(源文件)
        2、一个Mac Xcode项目(源文件)
        3、一个iPhone下使用的Sample Code(源文件)
        4、一个Mac下使用的Sample Code(源文件)
        5、一个Readme.texttile,关于该项目的介绍
    其实所有的内容都在其中了,如果你是初学者,不知到怎么下手,可以看 http://allseeing-i.com/ASIHTTPRequest/How-to-use这里有一份详细的入门指南。
    现在,我们要做的就是,在自己的项目中使用它。

一、在项目中使用ASIHTTPRequest
1、拷贝源文件到项目中
    ASIHTTPRequest是一个开源项目,要使用它,直接拷贝项目源文件到你的项目中,包括下列文件(即Classes下所有文件和External/Reachability下所有文件):
ASIHTTPRequestConfig.h
ASIHTTPRequestDelegate.h
ASIProgressDelegate.h
ASICacheDelegate.h
ASIHTTPRequest.h
ASIHTTPRequest.m
ASIDataCompressor.h
ASIDataCompressor.m
ASIDataDecompressor.h
ASIDataDecompressor.m
ASIFormDataRequest.h
ASIInputStream.h
ASIInputStream.m
ASIFormDataRequest.m
ASINetworkQueue.h
ASINetworkQueue.m
ASIDownloadCache.h
ASIDownloadCache.m
    对于 iPhone,还要拷贝下列文件:
ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
Reachability.h (External/Reachability目录)
Reachability.m(External/Reachability目录)

2、添加依赖库

ASIHTTPRequest依赖于以下5个框架或库:
CFNetwork、SystemConfiguration、MobileCoreServices、CoreGraphics和libz1.2.3。
依次将上述库和框架添加到target的Linked Libraries中。

二、简单的同步请求示例
    新建iOS项目,加入必需的源文件和Linked Libraries。往MainWindow.xib中添加一个UIButton,添加相应的outlet与action。编写按钮的Touch up inside代码,并连接到UIButton:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (IBAction)goURL {
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
     
    // 构造ASIHTTPRequest对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
     
    // 开始同步请求
    [request startSynchronous];
    NSError *erro = [request error];
    assert(!erro);
     
    // 如果请求成功,返回Response
    NSString *response = [request responseString];
    NSLog(@"%@", response);
}

别忘了在适当的地方导入ASIHTTPRequest:#import "ASIHTTPRequest.h"分别保存IB和Xcode中所做的更改,⌘+B编译。

三、简单的异步请求示例
将上述代码修改为:

1
2
3
4
5
6
7
8
9
10
11
- (IBAction)goURL {
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
     
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
     
    // 设定委托,委托自己实现异步请求方法
    [request setDelegate: self];
     
    // 开始异步请求
    [request startAsynchronous];
}

并 实现一系列委托方法:(别忘了在.h中添加import头文件以及delegate)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (IBAction)goURL
{
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
     
    // ASIHTTPRequest支持iOS4.0的块语法,可以把委托方法定义到块中
    [request setCompletionBlock:^{
        // 请求响应结束,返回response
        NSString *response = [request responseString];
        // 对于2进制数据,使用:NSData *response = [request responseData];
        NSLog(@"%@", response);
    }];
     
    [request setFailedBlock:^{
        // 请求失败,获取error
        NSError *error = [request error];
        NSLog(@"%@", [error userInfo]);
    }];
     
    [request startAsynchronous];
}

但此时出现了郁闷的一幕,代码块中的request对象出现警告信息:Capturing 'request' strongly in this block is likely to lead to a retain cycle。看到这个我就知道麻烦了,然后我查了一些资料,但没有很好的解决这个问题,大家可以参考一下这里 Block的Retain Cycle的解决方法。要是有谁知道麻烦说一下,大家相互学习。

参考文章:http://blog.csdn.net/kmyhy/article/details/6524893

转:http://my.oschina.net/iNiL0119/blog/179526

ASIHTTPRequest系列(一):同步和异步请求的更多相关文章

  1. C# ASP.NET Core使用HttpClient的同步和异步请求

    引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...

  2. ASIHTTP 框架,同步、 异步请求、 上传 、 下载

    ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...

  3. 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第四节:同步与异步请求方式

    前两节,我们对WebRequest和WebResponse这两个类做了介绍,但两者还相对独立.本节,我们来说说如何将两者结合起来,方式有哪些,有什么不同. 1.4.1 说结合,无非就是我们如何发送一个 ...

  4. js中同步与异步请求方式

    异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...

  5. Jquery的同步和异步请求

    1 异步请求:    1.1 $.ajax       $.ajax({                url : 'your url',                data:{name:valu ...

  6. ASP.NET Core使用HttpClient的同步和异步请求

    using System; using System.Collections.Generic; using System.Collections.Specialized; using System.I ...

  7. Swift3.0:Get/Post同步和异步请求

    一.介绍 Get和Post区别: Get是从服务器上获取数据,Post是向服务器发送数据. 对于Get方式,服务端用Request.QueryString获取变量的值,对于Post方式,服务端用Req ...

  8. $.post 和 $.get 设置同步和异步请求

    由于$.post() 和 $.get() 默认是 异步请求,如果需要同步请求,则可以进行如下使用:在$.post()前把ajax设置为同步:$.ajaxSettings.async = false;在 ...

  9. NSURLConnection和NSMutableURLRequest 实现同步、异步请求

    我是走向ios的一个小书童,我有很多不懂的,新鲜的知识去学习,去掌握! 我首先要吐槽一下: 那些不负责的博友!你分享知识本来是好事!可是你直接Control+V就是你的不对了! 尼玛,直接Contro ...

随机推荐

  1. Android网络框架之Retrofit + RxJava + OkHttp 变化的时代

    1.什么是Retrofit框架? 它是Square公司开发的现在非常流行的网络框架,所以我们在导入它的包的时候都可以看到这个公司的名字,目前的版本是2. 特点: 性能好,处理快,使用简单,Retrof ...

  2. FormData介绍

    FormData XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以 ...

  3. *使用配置类定义Codeigniter全局变量

    之前提到的 CodeIgniter 引入自定义公共函数 这篇文章提到了公共函数实现,全局的变量也可以借助 helper 函数来实现.不过,更为合适的方式可能要属用配置类定义了. CodeIgniter ...

  4. Java编程的逻辑 (4) - 整数的二进制表示与位运算

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  5. Amazon电商数据分析——数据获取

    最近一段时间主要重心在Amazon电商数据分析上,这是一个偏数据分析和可视化的项目.具体来说就是先获取Amazon的商品数据,数据清洗和持久化存储后作为我们自己的数据源.分析模块和可视化模块基于数据进 ...

  6. React Native Android启动白屏的一种解决方案下

    实现思路 思路大流程: 1.APP启动的时候控制ReactActivity从而显示启动屏. 2.编写原生模块,提供一个关闭启动屏的公共接口. 3.在js的适当位置(一般是程序初始化工作完成后)调用上述 ...

  7. spring@PropertySource用法

    测试例子 package com.hjzgg.auth.config; import org.springframework.beans.factory.annotation.Autowired; i ...

  8. 简单实现一个EventEmiter

    在前端开发中,“发布-订阅”也是“观察者模式”是一种常用的设计模式:之前对设计模式没有过深的认识,直到前段时间在封装一个运用AngularJS封装table组件时,遇到一个难题,那就是AngularJ ...

  9. 第二届i春秋挖洞大赛的一些感想

    挖洞比赛嘛,根据规则就是一个问题,如何在短时间内挖到更多.等级更高的漏洞? 先分析这个问题,需求是什么? 更多? 等级更高? 短时间内? 首先要解决的是时间的问题 时间有限,所以你必须要快.如何快?把 ...

  10. 大纲2.3 Internet

    Internet:域名系统基础知识和配置,上网查询访问的方法,常用电子邮件的种类和收发电子邮件的方法,网络信息搜索,网络信息下载.上传的基本方法,网络信息共享方法. DNS域名系统 域名 不区分大小写 ...