为什么异步NSURLConnection使iOS上的UI缓慢?

时间:2013-05-29 09:56:45

标签: ios performance networking nsurlconnection

我注意到,当在后台使用NSURLConnection进行下载时,在iPhone 4上滚动集合视图时的帧速率显着下降(有时达到5 FPS)。我首先怀疑AFNetworking是罪魁祸首,但事实证明,当我只是使用一个块时会发生同样的事情:

- (void)startBlockDownload:(id)sender
{
    NSLog(@"starting block download");

    dispatch_queue_t defQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    void (^downloadBlock) (void);

    downloadBlock = ^{
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:_urlString]];
        NSURLResponse *response = nil;
        NSError *error = nil;

        NSData* result = [NSURLConnection sendSynchronousRequest:request  returningResponse:&response error:&error];

        NSLog(@"block request done");
    };

    dispatch_async(defQueue, downloadBlock);
}

是什么给出的?背景下载是如此苛刻,以至于它使UI极其缓慢?这是慢速闪存吗?在进行后台下载时,有什么办法可以保持用户界面非常敏感吗?

我已经创建了一个示例项目来演示此问题:https://github.com/jfahrenkrug/AFNetworkingPerformanceTest

另请参阅有关AFNetworking的这个问题我已经开始讨论该主题:https://github.com/AFNetworking/AFNetworking/issues/1030#issuecomment-18563005

感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

正如你所链接的评论所说:iPhone 4仍然是一台单核机器,所以无论你做多少“多任务处理”,它仍然只会一次执行一组代码。更糟糕的是,sendSynchronousRequest和UI代码都是阻塞代码集,因此它们将占用操作系统分配给它们的最大时间,然后操作系统将执行昂贵的上下文切换以准备执行另一个。

您可以尝试两件事:

1)使用NSURLConnection的异步API,而不是发送同步请求(虽然我觉得你试过AFNetworking)。

2)降低您发送到的队列的优先级(如果可能,最好降低到DISPATCH_QUEUE_PRIORITY_BACKGROUND)。这可能会给主队列更多的循环执行,但它可能不会,因为整个操作只是一个大块。

如果这些都无法正常工作,那么对于单核处理器来说,它可能只是 太多(滚动不是轻量级操作,下载需要不断的运行时间来接收数据) 。无论如何,这是我最好的猜测......