gpt4 book ai didi

ios - 是否可以仅使用 NSURLSession 为 UITableViews 构建异步图像下载机制?如何?

转载 作者:行者123 更新时间:2023-12-01 18:56:35 24 4
gpt4 key购买 nike

我想为我的 UITableView 构建一个图像下载器因此图像可以异步加载到表格 View 中。

NSURLSession自动使用 NSURLCache要缓存 HTTP 请求,我能否仅依赖它作为我的缓存机制?我注意到很多人使用 NSCache保存下载的图像,但如果 NSURLSession已经实现了缓存,有必要吗?如果有的话,是不是很糟糕,因为我正在复制内存中的图像副本?

此外,如果可能的话,我如何将它与 UITableView 结合使用?单元重用在分配后台传输的结果方面提出了一个有趣的问题。

我不能简单地使用 NSURLSessionDownloadTask 下载图像并在完成 block 中设置单元格的图像,因为当它下载时,单元格可能已被重用,从而导致它将其设置为错误的单元格。

let downloadTask = session.downloadTaskWithURL(URL, completionHandler: { location, response, error in
var dataFetchingError: NSError? = nil
let downloadedImage = UIImage(data: NSData.dataWithContentsOfURL(location, options: nil, error: &dataFetchingError))

dispatch_async(dispatch_get_main_queue()) {
// Might end up on the wrong cell
cell.thumbnail.image = downloadedImage
}
})

那么如何确保分配的图像能够到达正确的单元格,并且我正在正确缓存这些下载?

我知道 SDWebImage 等,但我想尝试在不使用库的情况下解决这个问题。

最佳答案

在更新图像单元之前,您可以将最终调度到主队列,看看该单元是否仍然可见。您可以使用 cellForRowAtIndexPath (不要与名称相似的 UITableViewDataSource 方法混淆):

dispatch_async(dispatch_get_main_queue()) {
if let updateCell = tableView.cellForRowAtIndexPath(indexPath) as? MyCell {
updateCell.thumbnail.image = downloadedImage
}
}

(注意,这假设在异步更新进行时单元格的索引路径不可能更改。如果您可以在更新进行时插入/删除行,则不应只使用旧的 indexPath ,而是返回模型并重新计算此单元格的适当索引路径。)

显然,那些 UIImageView除了异步更新 ImageView 之外,类别还提供其他优势。例如,如果单元被重用,这些类别将取消对该单元的任何旧的未决网络请求。这很重要,因此如果您快速滚动,当前可见的单元格将在下载请求之后积压,这些单元格可能早已滚动出 View 。

但是,如果您只关心在更新图像之前确保单元格仍然可见,那么上面应该解决这个问题。

关于您的缓存问题,有两种不同类型的缓存需要讨论:RAM 缓存和持久存储缓存。 SDWebImage 和 AFNetworking UIImageView类别实现了自己的 RAM 缓存(使用 NSCache )以提高性能。但是,对于持久存储缓存,SDWebImage 实现了自己的缓存,AFNetworking 认为应该依赖内置的 NSURLCache。为了那个原因。我很同情 SDWebImage 的观点,因为 (a) 从历史上看 NSURLConnection在 iOS 上缓存到持久存储不一致; (b) 服务器在响应中使用错误的 header 很容易干扰缓存; (c) Apple 一直对什么时候被缓存以及什么时候不被缓存的标准不透明。

所以底线,可能有一个很好的论据来实现 NSCache如果你想要丝般平滑的滚动机制,但你也许可以依靠 NSURLCache用于持久存储缓存。

关于ios - 是否可以仅使用 NSURLSession 为 UITableViews 构建异步图像下载机制?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26332550/

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