iOS:ASIHttpRequest虽不更新,但仍值得详细了解

简介:

一、使用ASIHTTPRequest可以很方便的进行一下操作:同步/异步方式下载数据,定义下载队列,让队列中的任务按指定的并发数来下载(队列下载必须是异步的),提交表单,文件上传,处理cookie,设置代理,上下载进度条,重定向处理,请求与响应的GZIP,验证与授权。

使用ASIHTTPRequest可以很方便的进行一下操作:

  • 同步/异步方式下载数据
  • 定义下载队列,让队列中的任务按指定的并发数来下载(队列下载必须是异步的)
  • 提交表单,文件上传
  • 处理cookie
  • 设置代理
  • 上下载进度条
  • 重定向处理
  • 请求与响应的GZIP
  • 验证与授权

等等,只要跟HTTP有关,只有你想不到的,没有她做不到的~

配置方法:

  • 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 目录下)

库引用:

CFNetwork.framework

SystemConfiguration.framework

MobileCoreServices.framework

CoreGraphics.framework

和libz.dylib

另外,还需要libxml2.dylib(libxml2还需要设置连接选项-lxml2 和头文件搜索路径/usr/include/libxml2)

 

二、ASIHttpRequest创建和执行request

iOS开发中ASIHttpRequest如何创建和执行request,其中包括同步请求,异步请求,使用Block,使用队列,取消异步请求等等内容。

创建NSOperationQueue,这个Cocoa架构的执行任务(NSOperation)的任务队列。我们通过ASIHTTPRequest.h的源码可以看到,此类本身就是一个NSOperation的子类。也就是说它可以直接被放到任务队列中并被执行。

同步请求

同步请求会在当前线程中执行,使用error属性来检查结束状态(要下载大文件,则需要设定downloadDestinationPath来保存文件到本地):

复制代码
- (IBAction)grabURL:(id)sender 
{ 
   NSURL *url = [NSURL URLWithString:@"http://www.kenjiao.com"]; 
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
   [request startSynchronous]; 
   NSError *error = [request error]; 
   if (!error) { 
     NSString *response = [request responseString]; 
   } 
} 
复制代码

同步请求会阻塞主线程的执行,这导致用户界面不响应用户操作,任何动画都会停止渲染。

异步请求

下面是最简单的异步请求方法,这个request会在全局的NSOperationQueue中执行,若要进行更复杂的操作,我们需要自己创建NSOperationQueue或者ASINetworkQueue,后面会讲到。

复制代码
- (IBAction)grabURLInBackground:(id)sender 
{ 
       NSURL *url = [NSURL URLWithString:@"http://www.kenjiao.com"]; 
       ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
       [request setDelegate:self]; 
       [request startAsynchronous]; 
} 
 
- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
       // Use when fetching text data 
       NSString *responseString = [request responseString]; 
     
       // Use when fetching binary data 
       NSData *responseData = [request responseData]; 
} 
 
- (void)requestFailed:(ASIHTTPRequest *)request 
{ 
       NSError *error = [request error]; 
} 
复制代码

使用block

在平台支持情况下,ASIHTTPRequest1.8以上支持block。

复制代码
- (IBAction)grabURLInBackground:(id)sender 
{ 
       NSURL *url = [NSURL URLWithString:@"http://www.kenjiao.com"]; 
       __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
       [request setCompletionBlock:^{ 
          // Use when fetching text data 
          NSString *responseString = [request responseString]; 
 
          // Use when fetching binary data 
          NSData *responseData = [request responseData]; 
       }]; 
       [request setFailedBlock:^{ 
          NSError *error = [request error]; 
       }]; 
       [request startAsynchronous]; 
} 
复制代码

注意,声明request时要使用__block修饰符,这是为了告诉block不要retain request,以免出现retain循环,因为request是会retain block的。

使用队列

创建NSOperationQueue或者ASINetworkQueue队列,我们还可以设定最大并发连接数:maxConcurrentOperationCount

复制代码
- (IBAction)grabURLInTheBackground:(id)sender 
{ 
       if (![self queue]) { 
          [self setQueue:[[[NSOperationQueue alloc] init] autorelease]]; 
          [self queue].maxConcurrentOperationCount = 4; 
       } 
     
       NSURL *url = [NSURL URLWithString:@"http://www.kenjiao.com"]; 
       ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
       [request setDelegate:self]; 
       [request setDidFinishSelector:@selector(requestDone:)]; 
       [request setDidFailSelector:@selector(requestWentWrong:)]; 
       [[self queue] addOperation:request]; //queue is an NSOperationQueue 
} 
 
- (void)requestDone:(ASIHTTPRequest *)request 
{ 
       NSString *response = [request responseString]; 
} 
 
- (void)requestWentWrong:(ASIHTTPRequest *)request 
{ 
       NSError *error = [request error]; 
} 
复制代码

如果不设定selector,那么系统会使用默认的requestFinished: 和 requestFailed:方法

如果需要对队列里面的每个request进行区分,那么可以设定request的userInfo属性,它是个NSDictionary,或者更简单的方法是设定每个request的tag属性,这两个属性都不会被发送到服务器。

不要使用request的URL来区分每个request,因为URL可能会改变(例如重定向),如果需要使用request的URL,使用[request originalURL],这个将永远返回第一个url。

对于ASINetworkQueue

ASINetworkQueue是NSOperationQueue的子类,提供更高级的特性(ASINetworkQueue的代理函数):

  • requestDidStartSelector
    当一个request开始执行时,这个代理函数会被调用。
  • requestDidReceiveResponseHeadersSelector
    当队列中的request收到服务器返回的头信息时,这个代理函数会被调用。对于下载很大的文件,这个通常比整个request的完成要早。
  • requestDidFinishSelector
    当每个request完成时,这个代理函数会被调用。
  • requestDidFailSelector
    当每个request失败时,这个代理函数会被调用。
  • queueDidFinishSelector
    当队列完成(无论request失败还是成功)时,这个代理函数会被调用。

ASINetworkQueues与NSOperationQueues稍有不同,加入队列的request不会立即开始执行。如果队列打开了进度开关,那么队列开始时,会先对所有GET型request进行一次HEAD请求,获得总下载大小,然后真正的request才被执行。

向一个已经开始进行的ASINetworkQueue 加入request会怎样?

如果你使用ASINetworkQueue来跟踪若干request的进度,只有当新的request开始执行时,总进度才会进行自适应调整(向后移动)。ASINetworkQueue不会为队列开始后才加入的request进行HEAD请求,所以如果你一次向一个正在执行的队列加入很多request,那么总进度不会立即被更新。

如果队列已经开始了,不需要再次调用[queue go]。

当ASINetworkQueue中的一个request失败时,默认情况下,ASINetworkQueue会取消所有其他的request。要禁用这个特性,设置 [queue setShouldCancelAllRequestsOnFailure:NO]。

ASINetworkQueues只可以执行ASIHTTPRequest操作,二不可以用于通用操作。试图加入一个不是ASIHTTPRequest的NSOperation将会导致抛出错误。

取消异步请求

取消一个异步请求(无论request是由[request startAsynchronous]开始的还是从你创建的队列中开始的),使用[request cancel]即可。注意同步请求不可以被取消。

注意,如果你取消了一个request,那么这个request将会被视为请求失败,并且request的代理或者队列的代理的失败代理函数将被调用。如果你不想让代理函数被调用,那么将delegate设置为nil,或者使用clearDelegatesAndCancel方法来取消request。

clearDelegatesAndCancel 将会首先清除所有的代理和block。

当使用ASINetworkQueue时,如果取消了队列中的一个request,那么队列中其他所有request都会被取消,可以设置shouldCancelAllRequestsOnFailure的值为NO来避免这个现象。

安全地控制delegate防止request完成之前代理被释放

request并不retain它们的代理,所以有可能你已经释放了代理,而之后request完成了,这将会引起崩溃。大多数情况下,如果你的代理即将被释放,你一定也希望取消所有request,因为你已经不再关心它们的返回情况了。如此做:

复制代码
// 代理类的dealloc函数 
- (void)dealloc 
{ 
       [request clearDelegatesAndCancel]; 
       [request release]; 
       ... 
       [super dealloc]; 
} 
复制代码

三、ASIHttpRequest发送数据

ASIHttpRequest发送数据的内容,其中包括设定request头,使用ASIFormDataRequest POST表单,PUT请求、自定义POST请求等等内容。

设定request头

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request addRequestHeader:@"Referer" value:@"http://www.kenjiao.com/"]; 

使用ASIFormDataRequest POST表单

通常数据是以’application/x-www-form-urlencoded’格式发送的,如果上传了二进制数据或者文件,那么格式将自动变为‘multipart/form-data’ 。

文件中的数据是需要时才从磁盘加载,所以只要web server能处理,那么上传大文件是没有问题的。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:@"Ben" forKey:@"first_name"]; 
[request setPostValue:@"Copsey" forKey:@"last_name"]; 
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"]; 

数据的mime头是自动判定的,但是如果你想自定义mime头,那么这样:

复制代码
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
 
// Upload a file on disk 
[request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" 
forKey:@"photo"]; 
 
// Upload an NSData instance 
[request setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];
复制代码

你可以使用addPostValue方法来发送相同name的多个数据(梦维:服务端会以数组方式呈现):

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request addPostValue:@"Ben" forKey:@"names"]; 
[request addPostValue:@"George" forKey:@"names"]; 
[request addFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photos"]; 
[request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"]; 

PUT请求、自定义POST请求

如果你想发送PUT请求,或者你想自定义POST请求,使用appendPostData: 或者 appendPostDataFromFile:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]]; 
// Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody: 
[request setRequestMethod:@"PUT"]; 

四、ASIHTTPRequest进度追踪

ASIHTTPRequest进度追踪的内容,其中包括追踪单个request的下载进度,追踪一系列request的下载进度,追踪单个request的上传进度,追踪一系列request的上传进度,精确进度条vs简单进度条,自定义进度追踪等等内容。

每个ASIHTTPRequest有两个delegate用来追踪进度:

downloadProgressDelegate (下载) 和 uploadProgressDelegate (上载)。

进度delegate可以是NSProgressIndicators (Mac OS X) 或者 UIProgressViews (iPhone).ASIHTTPRequest会自适应这两个class的行为。你也可以使用自定义class作为进度delegate,只要它响应setProgress:函数。

  • 如果你执行单个request,那么你需要为该request设定upload/download进度delegate
  • 如果你在进行多个请求,并且你想要追踪整个队列中的进度,你必须使用ASINetworkQueue并设置队列的进度delegate
  • 如果上述两者你想同时拥有,恭喜你,0.97版以后的ASIHTTPRequest,这个可以有 ^ ^

IMPORTANT:如果你向一个要求身份验证的网站上传数据,那么每次授权失败,上传进度条就会被重置为上一次的进度值。因此,当与需要授权的web服务器交互时,建议仅当useSessionPersistence为YES时才使用上传进度条,并且确保你在追踪大量数据的上传进度之前,先使用另外的request来进行授权。 

追踪小于128KB的数据上传进度目前无法做到,而对于大于128kb的数据,进度delegate不会收到第一个128kb数据块的进度信息。这是因为CFNetwork库API的限制。我们曾向apple提交过bug报告(bug id 6596016),希望apple能修改CFNetwork库以便实现上述功能。

2009-6-21:Apple的哥们儿们真棒!iPhone 3.0 SDK里,buffer大小已经被减小到32KB了,我们的上传进度条可以更精确了。

追踪单个request的下载进度

这个例子中, myProgressIndicator是个 NSProgressIndicator.

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setDownloadProgressDelegate:myProgressIndicator]; 
[request startSynchronous]; 
NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]); 

追踪一系列request的下载进度

在这个例子中, myProgressIndicator 是个 UIProgressView, myQueue是个 ASINetworkQueue.

复制代码
- (void)fetchThisURLFiveTimes:(NSURL *)url 
{ 
   [myQueue cancelAllOperations]; 
   [myQueue setDownloadProgressDelegate:myProgressIndicator]; 
   [myQueue setDelegate:self]; 
   [myQueue setRequestDidFinishSelector:@selector(queueComplete:)]; 
   int i; 
   for (i=0; i<5; i++) { 
      ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
      [myQueue addOperation:request]; 
   } 
   [myQueue go]; 
} 
  
- (void)queueComplete:(ASINetworkQueue *)queue 
{ 
   NSLog(@"Value: %f", [myProgressIndicator progress]); 
} 
复制代码

这个例子中,我们已经为ASINetworkQueues调用过[myQueue go]了。

追踪单个request的上传进度

在这个例子中, myProgressIndicator 是个 UIProgressView。

复制代码
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:@"Ben" forKey:@"first_name"]; 
[request setPostValue:@"Copsey" forKey:@"last_name"]; 
[request setUploadProgressDelegate:myProgressIndicator]; 
[request startSynchronous]; 
NSLog(@"Value: %f",[myProgressIndicator progress]); 
复制代码

追踪一系列request的上传进度

这个例子中, myProgressIndicator是个 NSProgressIndicator, myQueue是个ASINetworkQueue.

复制代码
- (void)uploadSomethingFiveTimes:(NSURL *)url 
{ 
   [myQueue cancelAllOperations]; 
   [myQueue setUploadProgressDelegate:myProgressIndicator]; 
   [myQueue setDelegate:self]; 
   [myQueue setRequestDidFinishSelector:@selector(queueComplete:)]; 
   int i; 
   for (i=0; i<5; i++) { 
      ASIHTTPRequest *request = [ASIFormDataRequest requestWithURL:url]; 
      [request setPostBody:[@"Some data" dataUsingEncoding:NSUTF8StringEncoding]]; 
      [myQueue addOperation:request]; 
   } 
   [myQueue go]; 
} 
  
- (void)queueComplete:(ASINetworkQueue *)queue 
{ 
   NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]); 
} 
复制代码

精确进度条vs简单进度条

ASIHTTPRequest提供两种进度条显示,简单进度条和精确进度条,使用ASIHTTPRequests 和ASINetworkQueues的showAccurateProgress 来控制。为一个request设置showAccurateProgress只会对该request有效。如果你为一个队列设置showAccurateProgress,那么会影响队列里所有的request。

简单进度条

当使用简单进度条时,进度条只会在一个request完成时才更新。对于单个request,这意味着你只有两个进度状态:0%和100%。对于一个有5个request的队列来说,有五个状态:0%,25%,50%,75%,100%,每个request完成时,进度条增长一次。

简单进度条(showAccurateProgress = NO)是ASINetworkQueue的默认值,适用于大量小数据请求。

精确进度条

当使用精确进度条时,每当字节被上传或下载时,进度条都会更新。它适用于上传/下载大块数据的请求,并且会更好的显示已经发送/接收的数据量。

使用精确进度条追踪上传会轻微降低界面效率,因为进度delegate(一般是UIProgressViews 或NSProgressIndicators)会更频繁地重绘。

使用精确进度条追踪下载会更影响界面效率,因为队列会先为每个GET型request进行HEAD请求,以便统计总下载量。强烈推荐对下载大文件的队列使用精确进度条,但是要避免对大量小数据请求使用精确进度条。

精确进度条(showAccurateProgress = YES)是以同步方式执行的ASIHTTPRequest的默认值。

自定义进度追踪

ASIProgressDelegate 协议定义了所有能更新一个request进度的方法。多数情况下,设置你的uploadProgressDelegate或者 downloadProgressDelegate为NSProgressIndicator或者UIProgressView会很好。但是,如果你想进行更复杂的追踪,你的进度delegate实现下列函数要比 setProgress: (iOS) 或者 setDoubleValue: / setMaxValue: (Mac)好:

这些函数允许你在实际量的数据被上传或下载时更新进度,而非简单方法的0到1之间的数字。

downloadProgressDelegates方法

  • request:didReceiveBytes: 每次request下载了更多数据时,这个函数会被调用(注意,这个函数与一般的代理实现的 request:didReceiveData:函数不同)。
  • request:incrementDownloadSizeBy: 当下载的大小发生改变时,这个函数会被调用,传入的参数是你需要增加的大小。这通常发生在request收到响应头并且找到下载大小时。

uploadProgressDelegates方法

  • request:didSendBytes: 每次request可以发送更多数据时,这个函数会被调用。注意:当一个request需要消除上传进度时(通常是该request发送了一段数据,但是因为授权失败或者其他什么原因导致这段数据需要重发)这个函数会被传入一个小于零的数字。

五、ASIHTTPRequest断点续传(下载)

ASIHTTPRequest断点续传(下载)的内容,其中包括ASIHTTPRequest可以恢复中断的下载,设置一个临时下载路径,断点续传的工作原理等等内容。

从0.94版本开始,ASIHTTPRequest可以恢复中断的下载。

这个特性只对下载数据到文件中有效,你必须为一下情况的request设置allowResumeForFileDownloads 为YES:

  • 任何你希望将来可以断点续传的下载(否则,ASIHTTPRequest会在取消或者释放内存时将临时文件删除)
  • 任何你要进行断点续传的下载

另外,你必须自己设置一个临时下载路径(setTemporaryFileDownloadPath),这个路径是未完成的数据的路径。新的数据将会被添加到这个文件,当下载完成时,这个文件将被移动到downloadDestinationPath 。

复制代码
- (IBAction)resumeInterruptedDownload:(id)sender 
{ 
  NSURL *url = [NSURL URLWithString: 
    @"http://www.dreamingwish.com/wp-content/uploads/2011/10/asihttprequest-auth.png"]; 
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  
  NSString *downloadPath = @"/Users/ben/Desktop/asi.png"; 
  
  //当request完成时,整个文件会被移动到这里 
  [request setDownloadDestinationPath:downloadPath]; 
  
  //这个文件已经被下载了一部分 
  [request setTemporaryFileDownloadPath:@"/Users/ben/Desktop/asi.png.download"]; 
  [request setAllowResumeForFileDownloads:YES]; 
  [request startSynchronous]; 
  
  //整个文件将会在这里 
  NSString *theContent = [NSString stringWithContentsOfFile:downloadPath]; 
} 
复制代码

断点续传的工作原理是读取temporaryFileDownloadPath的文件的大小,并使用Range: bytes=x HTTP头来请求剩余的文件内容。

ASIHTTPRequest并不检测是否存在Accept-Ranges头(因为额外的HEAD头请求会消耗额外的资源),所以只有确定服务器支持断点续传下载时,再使用这个特性。

六、ASIHttpRequest请求HTTPS

复制代码
//一种方法 
  ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:[NSURLURLWithString:bodyString]];
  [request setDelegate:self];
  request.timeOutSeconds = 20;
  [request setRequestMethod:@"POST"];
  [request addRequestHeader:@"Content-Type"value:@"application/xml;charset=UTF-8;"];
  [request setValidatesSecureCertificate:NO];//请求https的时候,就要设置这个属性
  [request startAsynchronous];

 
    

//二种方法  
 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:bodyString]];
 [request setDelegate:self];
 request.timeOutSeconds = 20;
 [request setValidatesSecureCertificate:NO];//请求https的时候,就要设置这个属性
 [request setRequestMethod:@"POST"]; [request addRequestHeader:@"Content-Type" value:@"application/xml;charset=UTF-8"]; request.defaultResponseEncoding = NSUTF8StringEncoding;
复制代码

 

参考原址:http://mobile.51cto.com/iphone-405168.htm

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类:  iOS高级
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/5652576.html ,如需转载请自行联系原作者
相关文章
|
缓存 监控 数据处理
iOS - ASIHTTPRequest 网络请求
前言 使用 iOS SDK 中的 HTTP 网络请求 API,相当的复杂,调用很繁琐,ASIHTTPRequest 就是一个对 CFNetwork API 进行了封装,并且使用起来非常简单的一套 API,外号 “HTTP终结者”,用 Objective-C 编写,运行效率很高,可以很好的应用在 Mac OS X 系统和 iOS 平台的应用程序中,ASIHTTPRequest 适用于基本的 HTTP 请求,和基于 REST 的服务之间的交互。
1436 0
|
iOS开发 数据格式 XML
iOS图片上传服务器(ASIHTTPRequest,SpringMVC)
最近开始做自己app的服务器,因为正在参与的公司项目用的是springMVC,干脆拿这个做服务器,iOS端采用第三方鼎鼎大名的ASIHTTPRequest(但是已停更很久),经过一天折腾,终于实现简单的图片上传 配置ASIHTTPRequest,参见 ASIHTTPRequest配置说明 搭建简单的springMVC环境 代码 iOS端: -(void)upl
1109 0
|
JSON API 数据格式
iOS通过ASIHTTPRequest提交JSON数据
先验知识——什么是ASIHTTPRequest?   使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。
932 0
|
iOS开发
IOS开发---菜鸟学习之路--(十二)-利用ASIHTTPRequest进行异步获取数据
想要实现异步获取的话我这边了解过来有两个非常简单的方式 一个是利用ASIHTTPRequest来实现异步获取数据 另一个则是利用MBProgressHUD来实现异步获取数据 本章就先来讲解如何利用ASIHTTPRequest类来实现异步数据获取 首先大家需要百度一下ASIHTTPRequest 然后看一下百度里搜到的那些文章(不要问具体是那篇,因为我发现百度搜过来的东西全部都是一样的,所以。
982 0
|
iOS开发 UED 数据格式
iOS网络编程-ASIHTTPRequest异步请求
<p>我们运行程序,如果网速很慢,查询的时候会一直黑屏,直到请求结束画面才出现,这样用户体验很不好。因此同步请求一般只是在某个子线 程中使用,而不在主线程中使用。异步请求的用户体验要比同步请求好,因此一般情况下异步请求用的很多。等待过程中在状态栏上会出现网络等待指示器的经典旋 转小图标,而使用ASIHTTPRequest异步请求就实现这些效果,不用自己额外编写代码。</p> <p align=
1238 0
|
Go iOS开发
iOS网络编程-ASIHTTPRequest小例子-数据请求队列
<p><strong>实例:请求队列</strong></p> <p>我们通过一个例子介绍一下请求队列使用,我们设计了一个应用,用户点击GO按钮从服务器同时下载两张图片显示在画面中。</p> <p align="center"> <a href="http://www.iosbook3.com/wp-content/uploads/2013/03/7.jpg" data-mce-href="h
942 0
|
iOS开发 数据格式 JSON
iOS网络编程-ASIHTTPRequest框架同步请求
在ASIHTTPRequest框架中与HTTP请求相关的类有:ASIHTTPRequest和ASIFormDataRequest,其中最常用的是ASIHTTPRequest,ASIFormDataRequest是ASIHTTPRequest的子类,ASIFormDataRequest可以发送类似与HTML表单数据,也可以上传数据,默认采用POST请求方法。也可以其它的HTTP请求方法。它们都可
1215 0
|
iOS开发 缓存 MacOS
iOS网络编程--ASIHTTPRequest框架安装和配置-图文解说
<strong>ASIHTTPReques</strong>t框架是优秀的第三方Objective-C的HTTP框架,支持Mac OS X和iOS下的HTTP开发。技术支持网站是http://allseeing-i.com/ASIHTTPRequest/。具有如下优点:<br>支持下载数据放在内存或本地文件<br>容易访问请求和应答HTTP header<br>支持Cookie<br>支持GZ
1085 0
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
85 3