关闭

iOS开发ASIHttpRequest创建和执行request

119人阅读 评论(0) 收藏 举报

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

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

同步请求

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

  1. - (IBAction)grabURL:(id)sender 
  2.   NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"]; 
  3.   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  4.   [request startSynchronous]; 
  5.   NSError *error = [request error]; 
  6.   if (!error) { 
  7.     NSString *response = [request responseString]; 
  8.   } 

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

异步请求

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

  1. - (IBAction)grabURLInBackground:(id)sender 
  2.    NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"]; 
  3.    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  4.    [request setDelegate:self]; 
  5.    [request startAsynchronous]; 
  6.  
  7. - (void)requestFinished:(ASIHTTPRequest *)request 
  8.    // Use when fetching text data 
  9.    NSString *responseString = [request responseString]; 
  10.  
  11.    // Use when fetching binary data 
  12.    NSData *responseData = [request responseData]; 
  13.  
  14. - (void)requestFailed:(ASIHTTPRequest *)request 
  15.    NSError *error = [request error]; 

使用block

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

  1. - (IBAction)grabURLInBackground:(id)sender 
  2.    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
  3.    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  4.    [request setCompletionBlock:^{ 
  5.       // Use when fetching text data 
  6.       NSString *responseString = [request responseString]; 
  7.  
  8.       // Use when fetching binary data 
  9.       NSData *responseData = [request responseData]; 
  10.    }]; 
  11.    [request setFailedBlock:^{ 
  12.       NSError *error = [request error]; 
  13.    }]; 
  14.    [request startAsynchronous]; 

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

使用队列

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

  1. - (IBAction)grabURLInTheBackground:(id)sender 
  2.    if (![self queue]) { 
  3.       [self setQueue:[[[NSOperationQueue alloc] init] autorelease]]; 
  4.       [self queue].maxConcurrentOperationCount = 4; 
  5.    } 
  6.  
  7.    NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"]; 
  8.    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  9.    [request setDelegate:self]; 
  10.    [request setDidFinishSelector:@selector(requestDone:)]; 
  11.    [request setDidFailSelector:@selector(requestWentWrong:)]; 
  12.    [[self queue] addOperation:request]; //queue is an NSOperationQueue 
  13.  
  14. - (void)requestDone:(ASIHTTPRequest *)request 
  15.    NSString *response = [request responseString]; 
  16.  
  17. - (void)requestWentWrong:(ASIHTTPRequest *)request 
  18.    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,因为你已经不再关心它们的返回情况了。如此做:

  1. // 代理类的dealloc函数 
  2. - (void)dealloc 
  3.    [request clearDelegatesAndCancel]; 
  4.    [request release]; 
  5.    ... 
  6.    [super dealloc]; 
  7. }


0
0
查看评论

iOS开发ASIHttpRequest创建和执行request【2】

转载自:http://mobile.51cto.com/hot-403996.htm 本文为大家介绍了iOS开发中ASIHttpRequest如何创建和执行request,其中包括同步请求,异步请求,使用Block,使用队列,取消异步请求等等内容。 创建NSOperationQueu...
  • yuxikuo_1
  • yuxikuo_1
  • 2015-01-19 17:29
  • 362

iOS开发ASIHttpRequest创建和执行request

本文为大家介绍了iOS开发中ASIHttpRequest如何创建和执行request,其中包括同步请求,异步请求,使用Block,使用队列,取消异步请求等等内容。 创建NSOperationQueue,这个Cocoa架构的执行任务(NSOperation)的任务队列。我们通过ASIHTTPRe...
  • lianbaixue
  • lianbaixue
  • 2013-09-04 16:19
  • 749

iOS开发ASIHttpRequest介绍(一)-- ASIHttpRequest创建和执行request

来源:http://mobile.51cto.com/iphone-405168.htm 本文为大家介绍了iOS开发中ASIHttpRequest如何创建和执行request,其中包括同步请求,异步请求,使用Block,使用队列,取消异步请求等等内容。 创建NSOperationQueue,这个...
  • dztianyu
  • dztianyu
  • 2014-01-16 15:13
  • 625

iOS开发asi使用(一)ASIHttpRequest创建和执行request

本文为大家介绍了iOS开发中ASIHttpRequest如何创建和执行request,其中包括同步请求,异步请求,使用Block,使用队列,取消异步请求等等内容。
  • sky_2016
  • sky_2016
  • 2014-10-09 13:39
  • 467

ios开发之ASIHttpRequest-创建和执行request

同步请求 同步请求会在当前线程中执行,使用error属性来检查结束状态(要下载大文件,则需要设定downloadDestinationPath来保存文件到本地): - (IBAction)grabURL:(id)sender { NSURL *url = [NSURL URLWithSt...
  • pigkiss
  • pigkiss
  • 2013-01-25 16:00
  • 239

LoadRunner创建测试脚本

LoadRunner是一个强有力的压力测试工具。它的脚本可以录制生成,自动关联;测试场景可以面向指标,多方监控;测试结果可以用图表显示,并且可以拆分组合。作为专业的性能测试工具,通过模拟成千上万的用户对被测系统进行操作和请求,能够在实验室环境中重现生产环境中可能出现的业务压力,再通过测试过程中获取的...
  • Kinloloy
  • Kinloloy
  • 2009-04-03 10:37
  • 3156

ASIHttpRequest-创建和执行request

同步请求 同步请求会在当前线程中执行,使用error属性来检查结束状态(要下载大文件,则需要设定downloadDestinationPath来保存文件到本地): - (IBAction)grabURL:(id)sender { NSURL *url = [NSURL URLWithSt...
  • andy_jiangbin
  • andy_jiangbin
  • 2013-09-27 21:58
  • 308

ASIHttpRequest中Block代码块的使用和注意事项

使用ASIHttpRequest的setCompletionBlock、setFailedBlock时碰到一些诡异的内存泄漏和莫名其妙的行为(如:无法release对象)。 1. 声明ASIHttpRequest时一定要使用__block关键字   __block关键字告诉bloc...
  • yujianxiang666
  • yujianxiang666
  • 2015-04-20 13:16
  • 764

线程管理框架Executor,ExecutorService

之前的我们的线程启动是使用new Thread().start()这种方式来启动的,而且当要执行多个任务的时候就会创建多个线程来执行这些任务,下面我们来看看使用Executor框架来管理线程。 为什么要使用Executor线程池框架 1、每次执行任务创建线程 new Thread()比较消耗性能,创...
  • QH_JAVA
  • QH_JAVA
  • 2017-02-09 15:27
  • 512

iOS开发网络请求中ASIHTTPRequest的用法整理

ASIHTTPRequest是一款极其强劲的HTTP访问开源项目。让简单的API完成复杂的功能, 如: 异步请求,队列请求,GZIP压缩,缓存,断点续传,进度跟踪,上传文件,HTTP认证 在新的版本中,还加入了Objective-C闭包Block的支持,让我们的代码更加轻简灵活。 下面就...
  • yujianxiang666
  • yujianxiang666
  • 2015-04-07 15:00
  • 1382
    个人资料
    • 访问:154060次
    • 积分:2021
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:282篇
    • 译文:0篇
    • 评论:9条
    最新评论