gpt4 book ai didi

ios - 为什么异步 NSURLConnection 会使 iOS 上的 UI 变慢?

转载 作者:行者123 更新时间:2023-11-29 10:59:10 24 4
gpt4 key购买 nike

我注意到当在后台使用 NSURLConnection 下载时,在 iPhone 4 上滚动 Collection View 时帧率会显着下降(有时会下降到 5 FPS)。我首先怀疑 AFNetworking 是罪魁祸首,但事实证明,当我简单地使用一个 block 时,同样的事情发生了:

- (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

感谢任何帮助!

最佳答案

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

你可以尝试两件事:

1) 使用 NSURLConnection 的异步 API 而不是分派(dispatch)同步请求(尽管我觉得你用 AFNetworking 尝试过)。

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

如果两者都不起作用,那么它可能只是 单核处理器无法处理(滚动不是轻量级操作,下载需要持续运行时间来接收数据) .无论如何,这是我最好的猜测......

关于ios - 为什么异步 NSURLConnection 会使 iOS 上的 UI 变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16810819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com