`
zl4393753
  • 浏览: 340335 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

让ASIHTTPRequest不占用主线程

 
阅读更多
---转载文章。。备忘。。

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也支持同步请求,通过`-[ASIHTTPRequest startSynchronous]`方法可以实现。通常在后台线程中使用同步请求。 3. 集成与使用 ...

    ASIHTTPRequest

    在本文中,我们将深入探讨ASIHTTPRequest的核心特性、使用方法和常见应用场景。 1. **核心特性** - **异步请求**:ASIHTTPRequest支持异步HTTP请求,这意味着在请求进行时,应用程序可以继续执行其他任务,提高...

    asihttprequest带demo代码包

    在“asihttprequest带demo代码包”中,你将找到一个示例项目,它可以帮助你理解和使用 ASIHTTPRequest 库。 1. **请求发起**: - ASIHTTPRequest 支持 GET、POST、PUT、DELETE 等多种 HTTP 方法。 - 可以通过 `-...

    ASIHTTPRequest 源码

    1. **异步请求处理**:ASIHTTPRequest支持异步发送HTTP请求,这意味着在请求执行期间,应用的主线程不会被阻塞,可以保持良好的用户体验。 2. **易于使用**:API设计简洁,易于理解和使用。通过初始化请求对象并...

    ASIHTTPRequest框架

    同时,它也支持同步请求,适合在后台线程中使用,避免阻塞主线程。 2. **文件上传与下载**:框架内建了文件上传功能,可以通过POST或PUT方法将本地文件内容发送到服务器。同时,它支持断点续传,即使在下载过程中...

    ASIHttpRequest ios开发框架

    在iOS开发中,网络请求是必不可少的一部分,ASIHttpRequest框架通过封装底层的CFNetwork,简化了网络编程的复杂性。它提供了以下主要功能: 1. **异步请求**:ASIHttpRequest支持后台线程处理网络请求,不会阻塞...

    ASIHTTPRequest+UITableView实现多个下载任务

    在这个项目中,我们可能使用了它的downloadToFilePath:方法来指定文件下载的目标路径,并通过startAsynchronous方法异步开始下载任务,这样可以避免阻塞主线程,保持界面的流畅。 不过,需要注意的是,描述中提到这...

    ASIHTTPRequest断点续传

    总之,ASIHTTPRequest的断点续传功能使得开发者能够为用户提供更加友好的下载体验,即使在网络条件不稳定的情况下也能保证下载的连续性。理解这一功能的实现原理和使用方法,对于iOS开发者来说是非常有价值的。

    ASIHTTPRequest网络API

    首先,让我们详细了解一下ASIHTTPRequest库的核心功能和特性: 1. **异步请求**:ASIHTTPRequest支持异步网络请求,这意味着可以在不阻塞用户界面的情况下发送请求。这通过在后台线程执行网络操作并使用代理方法...

    ASIHTTPRequest网路请求

    1. 异步与同步请求:ASIHTTPRequest支持异步和同步两种方式,异步请求不会阻塞主线程,同步请求会等待请求完成再继续执行。 2. 文件上传与下载:提供了方便的文件上传和下载功能,能处理大文件且进度可监控。 3. ...

    asihttpRequest

    首先,ASIHTTPRequest 支持异步和同步 HTTP 请求,这使得开发者可以在不阻塞主线程的情况下进行网络操作,从而保持用户界面的流畅性。异步请求对于处理网络延迟或大文件下载尤其重要,因为它允许应用程序在等待响应...

    让ASIHTTPRequest兼容ARC,并上传图片到服务器

    在实际项目中,为了提高性能和用户体验,你可能还需要考虑使用队列管理请求,避免同时发送过多请求,以及在网络不稳定时进行重试等策略。同时,确保服务器端接口能够正确接收并处理上传的图片数据。 总的来说,虽然...

Global site tag (gtag.js) - Google Analytics