我正在做一个 UITableview 来下载名称 webservice 的数据非常快,所以我最初使用它来填充表格,然后我为图像启动一个操作队列。
然后是其余数据的单独队列,因为它加载非常慢但会影响图像加载时间,我如何同时执行 2 个。
你能找出是什么降低了那里的性能并帮助我解决它吗?
我正在做一个 UITableview 来下载名称 webservice 的数据非常快,所以我最初使用它来填充表格,然后我为图像启动一个操作队列。
然后是其余数据的单独队列,因为它加载非常慢但会影响图像加载时间,我如何同时执行 2 个。
你能找出是什么降低了那里的性能并帮助我解决它吗?
我假设您知道,您可以通过maxConcurrentOperationCount
在创建队列时进行设置来指定并发请求的数量。四是典型值。
self.imageDownloadingQueue.maxConcurrentOperationCount = 4;
问题是,你不能比这更大(由于 iOS 限制和一些服务器限制)。可能有 5 个,但不会比这个大。
就个人而言,我不会用完有限数量的最大并发操作返回文本值。我会提前检索所有这些。您会延迟加载图像,因为它们太大了,但文本条目太小,以至于执行单独的网络请求的开销开始强加其自身的性能损失。如果您要延迟加载描述,我会分批下载 50 个或 100 个左右。
查看您的源代码,至少,您发出的 JSON 请求是您应该发出的两倍(您在getAnimalRank
和getAnimalType
)。但是你真的应该改变最初的 JSON 请求来返回你需要的一切,名称、等级、类型、URL(但不是图像本身)。然后在一次调用中,您就可以获得所需的一切(除了图像,我们将异步检索,并且您的服务器为 UX 快速交付图像)。如果您决定保留对排名/类型/url 的各个请求,则需要查看您的服务器代码,因为没有正当理由不应该立即返回,而且目前确实很慢。但是,正如我所说,您真的应该在初始 JSON 请求中返回所有这些,并且您的用户界面会非常快。
最后一点:您正在使用单独的队列来获取详细信息和图像下载。使用NSOperationQueue
和设置的全部目的maxConcurrentOperationCount
是 iOS 只能对给定服务器执行 5 个并发请求。通过将它们放在两个单独的队列中,您将失去maxConcurrentOperationCount
. 事实证明,请求超时需要一分钟,因此您可能不会遇到问题,但它仍然反映了对队列目的的基本误解。
最重要的是,您应该只有一个网络队列(因为系统限制是您的设备和任何给定服务器之间的网络并发连接数量,而不是图像下载数量,以及单独的描述下载数量)。
您是否考虑过异步执行此操作?我写了一个类来做一些与你使用块描述的非常相似的事情。您可以通过以下两种方式执行此操作:
只要 cellForRowAtIndexPath 触发就加载异步。这适用于很多情况,但可能会导致错误的图像显示一秒钟,直到正确的图像完成加载。
当拖动停止时调用进程加载图像。这通常是我做事的方式,以便正确的图像始终显示它应该显示的位置。在从 Web 加载图像之前,您可以使用占位符图像。
查看这个 SO question 的详细信息: