1

我注意到当在后台使用 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 非常缓慢?是闪存慢吗?在进行后台下载时,是否可以采取任何措施来保持 UI 响应迅速?

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

另请参阅我已经开始关于该主题的 AFNetworking 上的此问题:https ://github.com/AFNetworking/AFNetworking/issues/1030#issuecomment-18563005

任何帮助表示赞赏!

4

1 回答 1

2

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

你可以尝试两件事:

1)使用异步 APINSURLConnection而不是分派同步请求(尽管我感觉你尝试过这个AFNetworking)。

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

如果这两个都不能工作,那么单核处理器可能处理不了太多(滚动不是一个轻量级的操作,下载需要恒定的运行时间来接收数据)无论如何,这是我最好的猜测......

于 2013-05-29T10:14:15.800 回答