4. ASIHTTPRequest-进度追踪

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

  • 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来进行受权。  app

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

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

 

追踪单个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. url

- (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。 code

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. orm

- (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发送了一段数据,可是由于受权失败或者其余什么缘由致使这段数据须要重发)这个函数会被传入一个小于零的数字。
相关文章
相关标签/搜索