gpt4 book ai didi

ios - 从 Collection View 内部的url下载图像的性能哪种方法更好?

转载 作者:行者123 更新时间:2023-11-28 23:24:38 25 4
gpt4 key购买 nike

从collectionview内部的url下载图像的性能哪种方法更好?

例如
从服务器url下载图像可以通过多种方式完成,哪种方式更好:
1)使用qos = Utility创建全局调度并发队列。然后只需执行异步下载代码的方式。

private func donwnloadwithGlobalQueue(at indexpath : IndexPath){
DispatchQueue.global(qos: .utility).async { [weak self] in
guard let weakself = self else{
return
}
let url = weakself.urls[indexpath.item]

guard let data = try? Data(contentsOf: url),
let image = UIImage(data: data) else{
return
}
DispatchQueue.main.async {
if let cell = self?.collectionView.cellForItem(at: indexpath) as? PhotoCell {
cell.display(image: image)
}
}
}

}


2)使用nsurlssion数据任务方法。

private func downloadwithURLSession(at indexpath : IndexPath){
URLSession.shared.dataTask(with: urls[indexpath.row]) { [weak self] (data, response, error) in
guard let weakself = self,
let data = data,
let image = UIImage(data: data) else{
return
}

DispatchQueue.main.async {
if let cell = weakself.collectionView.cellForItem(at: indexpath) as? PhotoCell {
cell.display(image: image)
}
}
}.resume()
}

最佳答案

下载性能将难以区分。

但是,您应该使用URLSession(或类似Kingfisher的库,它也使用URLSession),因为(a)它可以使您更好地控制连接; (b)如果失败,它将为您提供更多的诊断信息; (c)它提供取消功能。我们经常谈论不同方法的“利弊”,但是在Data(contentsOf:)的情况下,这仅仅是“利弊”。

话虽如此,我们有五种主要方法来提高性能:


快取

请确保在您的应用下载图像后,如果该单元格滚动到视图之外然后又回到视图中,则您不会发起新的网络请求。您刚刚下载了资产,因此应该使用它。有时URLSession免费提供这种缓存,尽管它在某种程度上取决于您的Web服务器的配置。因此,我们经常自己进行缓存,既要在RAM中使用较小的缓存(例如NSCache),又要在持久性存储中使用较大的缓存(例如.cachesDirectory)。诸如翠鸟之类的库会为您完成所有这些缓存。

这不会改善初始获取,但是通过避免重新获取已经下载的内容,可以极大地提高性能。
预取

您可以打开预取功能,在该操作中,当完成为可见单元格请求数据的操作后,它将为可能很快滚动到视图中的单元格请求数据。这意味着,假设有机会赶上,在滚动时,它将显示已经预取了其数据的单元格(并且在进行此操作时,它将预取下一个可能出现的单元格的数据)。

因此,同样,这不会改善初始获取。但是,如果有机会赶上,那么以适度的速度滚动时感觉会快得多。

请参见isPrefetchingEnabledUICollectionView文档中的“预取集合视图单元格和数据”讨论。
取消订单

当您在集合视图中快速滚动时,您要确保取消对不再可见的单元格的请求。例如,如果您快速滚动以查看100-119单元格,则确实不想积压等待0-99单元格的图像,这些图像不再可见。

这就是为什么您真正想要使用基于URLSession的方法的原因,在该方法中,您可以保存对正在运行的URLSessionTask的弱引用,并在单元被重用时将其取消。或者,如果使用Kingfisher,则将cancelDownloadTask设置为UIImageView
下载大小合适的资产

如果可能,下载大小合适的资产。例如,假设图片为2,000×2,000像素。但是,假设您使用的是3×视网膜设备,其图像视图为100×100点。这意味着您应该下载300×300像素的图像(360kb的数据,可能压缩到50-100kb以下),而不是2,000×2,000的资产(16mb的数据,甚至压缩后可能超过1mb)。显然,这隐含了您还要下载经过合理压缩的资产。

诚然,如果您尚未实现此功能,那么在服务器上准备好不同大小的资产并不是一件容易的事,但是对于精心设计的Web服务来说,通常会(a)准备不同大小的资产; (b)提供API以下载客户端应用所需的任何大小。

如果下载大资产以显示在小集合视图单元中,则这会对实际性能产生巨大影响。
压缩

也许无需多说(因为它很常见),但请确保服务器传输的资产已充分压缩。例如。压缩质量为70-80%的JPEG看起来不错,但比未压缩的资产小得多。 PNG也提供压缩功能,但通常不提供与JPEG相当的尺寸(因为除其他因素外,这是一种无损压缩)。

最重要的是,请确保服务器上的资产得到合理压缩,从而在质量和大小之间取得平衡。恕我直言,某些服务在压缩资产,严重降低图像质量(我在与您聊天,Facebook)方面走得太远了,但请选择适合您的应用程序的合理平衡。


因此,我对Kingfisher之类的图书馆提出了其他建议。它简化了您的客户端代码,并自动发布了问题1(缓存)。但是问题2和3(预取和取消)将需要您做一些工作,但这非常简单。问题4(和问题5)的影响最大(如果您没有适当大小的资产),但是您会受到网络服务的支配。

关于ios - 从 Collection View 内部的url下载图像的性能哪种方法更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59032091/

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