ASIHTTPRequest的使用——队列请求
2016-06-15 22:44
573 查看
队列请求提供了一个对异步请求更加精准丰富的控制。
如,可以设置在队列中,同步请求的连接数。
往队列里添加的请求实例数大于maxConcurrentOperationCount时,请求实例将被置为等待,直到前面至少有一个请求完成并出列才
被放到队列里执行。
也适用于当我们有多个请求需求按顺序执行的时候(可能是业务上的需要,也可能是软件上的调优),仅仅需要把maxConcurrentOperationCount 设为“1”。
- (void)grabURLInTheBackground:(id)sender
{
if (![self queue])
{
// 创建任务队列
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 设置代理
[request setDelegate:self];
// 设置实现方法
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
// queue is an NSOperationQueue
[[self queue] addOperation:request];
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
请求队列上下文
a、可以设置一个上下文(userInfo)到request对象中,当请求响应完后可以通过访问request对象的userInfo获取里面的信息
b、为每一个请求实例设置不同的setDidFinishSelector / setDidFailSelector的回调方法
c、子类化ASIHTTPRequest,重写requestFinished: 与 failWithProblem:方法
ASINetworkQueues, 它的delegate提供更为丰富的功能
提供的更多的回调方法如下:
a、requestDidStartSelector,请求发起时会调此方法,你可以在此方法中跟据业务选择性的设置request对象的deleaget。
b、requestDidReceiveResponseHeadersSelector,当接受完响应的Header后设计此方法,这个对下载大数据的时候相当有用,你可以在方法里做更多业务上的处理。
c、requestDidFinishSelector,请求并响应成功完成时调用此方法
d、requestDidFailSelector,请求失败
e、queueDidFinishSelector,整个队列里的所有请求都结束时调用此方法。
注意:添加到队列中其实并不能执行请求,只有调用[queue go]才会执行;一个正在运行中的队列,并不需要重复调用[queue go]。
默认情况下,队列中的一个请求如果失败,它会取消所有未完成的请求。
可以设置[queue setShouldCancelAllRequestsOnFailure:NO]来修 正。
队列请求中需要注意的是,如果你取消了一个请求,队列会自动取消其它所有请求。
如果只想取消一个请求,可以设置队列:[queue setShouldCancelAllRequestsOnFailure:NO];
如果想明确取消所有请求:[queue cancelAllOperations];
如,可以设置在队列中,同步请求的连接数。
往队列里添加的请求实例数大于maxConcurrentOperationCount时,请求实例将被置为等待,直到前面至少有一个请求完成并出列才
被放到队列里执行。
也适用于当我们有多个请求需求按顺序执行的时候(可能是业务上的需要,也可能是软件上的调优),仅仅需要把maxConcurrentOperationCount 设为“1”。
- (void)grabURLInTheBackground:(id)sender
{
if (![self queue])
{
// 创建任务队列
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 设置代理
[request setDelegate:self];
// 设置实现方法
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
// queue is an NSOperationQueue
[[self queue] addOperation:request];
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
请求队列上下文
a、可以设置一个上下文(userInfo)到request对象中,当请求响应完后可以通过访问request对象的userInfo获取里面的信息
b、为每一个请求实例设置不同的setDidFinishSelector / setDidFailSelector的回调方法
c、子类化ASIHTTPRequest,重写requestFinished: 与 failWithProblem:方法
ASINetworkQueues, 它的delegate提供更为丰富的功能
提供的更多的回调方法如下:
a、requestDidStartSelector,请求发起时会调此方法,你可以在此方法中跟据业务选择性的设置request对象的deleaget。
b、requestDidReceiveResponseHeadersSelector,当接受完响应的Header后设计此方法,这个对下载大数据的时候相当有用,你可以在方法里做更多业务上的处理。
c、requestDidFinishSelector,请求并响应成功完成时调用此方法
d、requestDidFailSelector,请求失败
e、queueDidFinishSelector,整个队列里的所有请求都结束时调用此方法。
注意:添加到队列中其实并不能执行请求,只有调用[queue go]才会执行;一个正在运行中的队列,并不需要重复调用[queue go]。
默认情况下,队列中的一个请求如果失败,它会取消所有未完成的请求。
可以设置[queue setShouldCancelAllRequestsOnFailure:NO]来修 正。
队列请求中需要注意的是,如果你取消了一个请求,队列会自动取消其它所有请求。
如果只想取消一个请求,可以设置队列:[queue setShouldCancelAllRequestsOnFailure:NO];
如果想明确取消所有请求:[queue cancelAllOperations];
相关文章推荐
- 30分钟让网站支持HTTPS
- 【网络】学习IO 多路复用 select
- swift基础值网络请求
- ASIHTTPRequest的使用——同步或异步请求
- DES 3DES AES学习总结
- 论文解析:人脸检测中级联卷积神经网络的联合训练
- HTTP,TCP,Socket
- [转]Windows网络编程学习-面向连接的编程方式
- HttpClient模式下的Post方法,可以中文显示
- HttpURLConnection的用法
- 【复习】servlet之Http状态码
- 【复习】servlet之HttpServletResponse
- Android Studio无法使用Apache的HttpClient
- TCP/IP指南
- 子网划分的两个例子
- IP地址、子网掩码、网络号、主机号、网络地址、主机地址
- 详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
- OKHTTP通信使用(三)HTTPS
- HTTP状态码详解
- 关于 包、帧、数据报、段和消息 的概念区别