我注意到,当在后台使用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
感谢任何帮助!
答案 0 :(得分:2)
正如你所链接的评论所说:iPhone 4仍然是一台单核机器,所以无论你做多少“多任务处理”,它仍然只会一次执行一组代码。更糟糕的是,sendSynchronousRequest和UI代码都是阻塞代码集,因此它们将占用操作系统分配给它们的最大时间,然后操作系统将执行昂贵的上下文切换以准备执行另一个。
您可以尝试两件事:
1)使用NSURLConnection
的异步API,而不是发送同步请求(虽然我觉得你试过AFNetworking
)。
2)降低您发送到的队列的优先级(如果可能,最好降低到DISPATCH_QUEUE_PRIORITY_BACKGROUND)。这可能会给主队列更多的循环执行,但它可能不会,因为整个操作只是一个大块。
如果这些都无法正常工作,那么对于单核处理器来说,它可能只是 太多(滚动不是轻量级操作,下载需要不断的运行时间来接收数据) 。无论如何,这是我最好的猜测......