---转载文章。。备忘。。
ASIHTTPRequest是个很易用的iOS / Mac OS X平台的HTTP库,比NSURLRequest好用多了,所以我一直在用它。
不过使用中我发现,当下载线程数超过2时,就会影响到主线程响应用户请求的速度了。好奇之余我测试了一下completionBlock,发现它总是在主线程调用,而NSOperation的文档中却说一般会在子线程中执行。
于是看了下ASIHTTPRequest.m,终于发现问题所在了:
// Subclasses might override this method to process the result in the same thread
// If you do this, don't forget to call [super requestFinished] to let the queue / delegate know we're done
- (void)requestFinished
{
#if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING
NSLog(@"[STATUS] Request finished: %@",self);
#endif
if ([self error] || [self mainRequest]) {
return;
}
if ([self isPACFileRequest]) {
[self reportFinished];
} else {
[self performSelectorOnMainThread:@selector(reportFinished) withObject:nil waitUntilDone:[NSThread isMainThread]];
}
}
这段代码显示了,在不使用自动代理脚本时,就会在主线程执行reportFinished。
解决的办法很简单,可以按它所说的继承ASIHTTPRequest,并改写requestFinished方法。或者像我这种懒人,直接改源码:
- (void)requestFinished
{
#if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING
NSLog(@"[STATUS] Request finished: %@",self);
#endif
if ([self error] || [self mainRequest]) {
return;
}
[self reportFinished];
}
改完后重新构建一遍,发现至少5个下载线程时也不会影响主线程了,搞定收工~
分享到:
相关推荐
- 同步请求:虽然不推荐在主线程中使用同步请求,因为会阻塞用户界面,但ASIHTTPRequest也支持同步请求,通过`-[ASIHTTPRequest startSynchronous]`方法可以实现。通常在后台线程中使用同步请求。 3. 集成与使用 ...
在本文中,我们将深入探讨ASIHTTPRequest的核心特性、使用方法和常见应用场景。 1. **核心特性** - **异步请求**:ASIHTTPRequest支持异步HTTP请求,这意味着在请求进行时,应用程序可以继续执行其他任务,提高...
在“asihttprequest带demo代码包”中,你将找到一个示例项目,它可以帮助你理解和使用 ASIHTTPRequest 库。 1. **请求发起**: - ASIHTTPRequest 支持 GET、POST、PUT、DELETE 等多种 HTTP 方法。 - 可以通过 `-...
1. **异步请求处理**:ASIHTTPRequest支持异步发送HTTP请求,这意味着在请求执行期间,应用的主线程不会被阻塞,可以保持良好的用户体验。 2. **易于使用**:API设计简洁,易于理解和使用。通过初始化请求对象并...
同时,它也支持同步请求,适合在后台线程中使用,避免阻塞主线程。 2. **文件上传与下载**:框架内建了文件上传功能,可以通过POST或PUT方法将本地文件内容发送到服务器。同时,它支持断点续传,即使在下载过程中...
在iOS开发中,网络请求是必不可少的一部分,ASIHttpRequest框架通过封装底层的CFNetwork,简化了网络编程的复杂性。它提供了以下主要功能: 1. **异步请求**:ASIHttpRequest支持后台线程处理网络请求,不会阻塞...
在这个项目中,我们可能使用了它的downloadToFilePath:方法来指定文件下载的目标路径,并通过startAsynchronous方法异步开始下载任务,这样可以避免阻塞主线程,保持界面的流畅。 不过,需要注意的是,描述中提到这...
总之,ASIHTTPRequest的断点续传功能使得开发者能够为用户提供更加友好的下载体验,即使在网络条件不稳定的情况下也能保证下载的连续性。理解这一功能的实现原理和使用方法,对于iOS开发者来说是非常有价值的。
首先,让我们详细了解一下ASIHTTPRequest库的核心功能和特性: 1. **异步请求**:ASIHTTPRequest支持异步网络请求,这意味着可以在不阻塞用户界面的情况下发送请求。这通过在后台线程执行网络操作并使用代理方法...
1. 异步与同步请求:ASIHTTPRequest支持异步和同步两种方式,异步请求不会阻塞主线程,同步请求会等待请求完成再继续执行。 2. 文件上传与下载:提供了方便的文件上传和下载功能,能处理大文件且进度可监控。 3. ...
首先,ASIHTTPRequest 支持异步和同步 HTTP 请求,这使得开发者可以在不阻塞主线程的情况下进行网络操作,从而保持用户界面的流畅性。异步请求对于处理网络延迟或大文件下载尤其重要,因为它允许应用程序在等待响应...
在实际项目中,为了提高性能和用户体验,你可能还需要考虑使用队列管理请求,避免同时发送过多请求,以及在网络不稳定时进行重试等策略。同时,确保服务器端接口能够正确接收并处理上传的图片数据。 总的来说,虽然...