官方网站: http://allseeing-i.com/ASIHTTPRequest/ 。能够从上面下载到最新源码,以及获取到相关的资料。html
使用iOS SDK中的HTTP网络请求API,至关的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,而且使用起来很是简单的一套API,用Objective-C编写,能够很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。缓存
ASIHTTPRequest功能很强大,主要特点以下:网络
若是想在iOS项目中使用ASIHTTPRequest,须要在项目中进行简单的配置,步骤以下:异步
往一个Xcode项目中添加第三方类库文件,有两种方式:post
1. 第一种方式,在Finder中打开须要添加到文件或文件夹,在Xcode中打开要添加文件的项目,而后选中要添加的文件或文件夹,将它从Finder中拖到Xcode中,而后释放。在弹出的对话框中,若是文件已经拷贝到了项目文件目录中,则不须要选中“Copy items”的复选框;若是文件没有拷贝到项目文件目录,就须要选中“Copy items”的复选框,这样Xcode会自动把文件复制到项目文件目录下。以下图所示:网站
2. 第二种方式,在Xcode中,在要添加文件的分组下点右键,选中“Add Files to “My Project”…”菜单,在弹出的文件浏览对话框中选中要添加到文件或文件夹。若是要添加文件已经拷贝到了项目文件目录中,则不须要选中“Copy items”的复选框;若是文件没有拷贝到项目文件目录,就须要选中“Copy items”的复选框,这样Xcode会自动把文件复制到项目文件目录下。以下图所示:ui
根据上面的说明,添加ASIHTTPRequest相关文件到Xcode项目中,所需文件列表以下:url
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
ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
Reachability.h (在源码的 External/Reachability 目录下)
Reachability.m (在源码的 External/Reachability 目录下)
1. 选中项目
2. 选中目标
3. 跳转到“Build Phases”标签
4. 展开“Link Binary With Libraries”分组
5. 点击“+”添加类库
以下图所示:
6. 从列表中选择CFNetwork.framework,而后点击“Add”按钮。
7. 按照上一步相同的方法添加:SystemConfiguration.framework, MobileCoreServices.framework,CoreGraphics.framework和libz.1.2.3.dylib这几个类库。
8. 添加完后,能够将添加好的一块儿类库拖到Xcode项目的Frameworks目录下
ASIHTTPRequest有不少功能,全部功能说明均可以在其官方网站的相关文档中查到,限于篇幅,本章仅简单介绍一下如何使用ASIHTTPRequest来进行同步Http请求和异步Http请求。在后面的章节中,咱们还会用到它的一些其余功能。
在使用ASIHTTPRequest以前,请确认已经正确安装,而后在须要应用它的代码文件头部,加入:
#import “ASIHTTPRequest.h”
这样就能够在代码中使用ASIHTTPRequest相关的类。
这是ASIHTTPRequest最简单的一种使用模式,发送startSynchronous消息后即开始在同一线程中执行HTTP请求,线程将一直等待直到请求结束(请求成功或者失败)。经过检查error属性能够判断请求是否成功或者有错误发生。
要获取返回的文本信息,调用responseString方法。若是下载的是二进制文件,例如图片、MP3,则调用responseData方法,能够获得一个NSData对象。
- (IBAction)grabURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
}
通常状况下,应该优先使用异步请求代替同步请求,当在主线程中使用ASIHTTPRequest同步请求,应用程序的界面会锁定,没法进行任何操做,直到请求完成。
上例中的同步请求,若是换成异步方式来调用,请求是在后台线程中运行,当请求执行完后再通知调用的线程。这样不会致使主线程进行网络请求时,界面被锁定等状况。
- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
// 当以文本形式读取返回内容时用这个方法
NSString *responseString = [request responseString];
// 当以二进制形式读取返回内容时用这个方法
NSData *responseData = [request responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}