在 tableview 中显示下载的图像
Posted
技术标签:
【中文标题】在 tableview 中显示下载的图像【英文标题】:display downloaded images in tableview 【发布时间】:2015-09-15 19:49:16 【问题描述】:我正在使用 Swift 2.0 制作应用程序,并且在原型单元格中使用带有图像视图的表格视图。该应用程序从 facebook 服务器下载一些图像,我想显示它们。这些图像都是从不同的 url 下载的,所以我正在使用一个程序来循环它们并下载,就像我使用名称从互联网上获取它们并显示一样,但我有点卡住了..
func fetchPicture(identifier: String, completion: (image: UIImage) -> Void)
let url2 = NSURL (string: "http://graph.facebook.com/" + identifier + "/picture?type=normal")
let urlRequest = NSURLRequest(URL: url2!)
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue())
(response, data, error) -> Void in
if error != nil
print(error)
else
if let pf = UIImage(data: data!)
dispatch_async(dispatch_get_main_queue())
completion(image: pf)
self.tableView.reloadData()
var images = [UIImage]()
let queue2 = dispatch_queue_create("images", DISPATCH_QUEUE_SERIAL)
dispatch_apply(newArray.count, queue2) index in
let identifier = newArray[index]
fetchPicture(identifier)
image in dispatch_async(queue2)
我将单元格中的 imageview 设置为等于变量“image”,所以基本上我需要做一些类似 self.image = pf 的事情,但每个用户需要不同。使用名称,我使用数组执行此操作,但这不适用于我假设的图像..
帮助非常感谢伙计们! 谢谢!
【问题讨论】:
顺便说一句,如果你自己实现了这个,你可能会考虑使用NSURLSession
而不是最近不推荐使用的NSURLConnection
。
【参考方案1】:
您通常希望使用专门处理此类内容的框架。我会不推荐使用 SDWebImage,它已经过时(没有 NSURLSession),有很多未解决的问题并且不能很好地与 Swift 配合使用(没有可空性注释)。
看看这两个与 ios 平台保持同步的库:
DFImageManager - 用 Objective-C 编写的高级框架,但具有可空性注释(适用于 Swift)。这是一个比 SDWebImage 更好的list of things。 披露这是我写的,观点可能有偏见。 Kingfisher - 用 Swift 编写的轻量级库。与 SDWebImage 类似,但功能远不如 SDWebImage 和 DFImageManager。【讨论】:
如果问题重复,标记问题。在任何情况下,都不要破坏已接受的答案。谢谢。【参考方案2】:您通常不希望像这样加载所有图像。您绝对不想在每个图像之后重新加载整个表格(因为这会导致它滚动回表格视图的顶部)。
通常建议懒惰地获取图像(即在需要它们之前不要)。您可以从cellForRowAtindexPath
调用fetchPicture
,并在完成处理程序中相应地更新单元格的图像视图。
不过,您需要担心很多细节:
首先,在提取完成时,单元格可能已被重复使用,因此您必须检查以确保单元格仍然可见。
其次,我建议使用NSCache
,而不是使用数组,并确保在内存压力时清除此缓存。您可能还希望缓存到持久存储,尽管有些人更喜欢依赖 NSURLCache
机制
第三,如果单元格滚动到视图之外,您可能想要取消请求(例如,如果您快速滚动到第 100 行,则该图像请求不会积压在其他 99 个不再可见的单元格的图像请求)。
就个人而言,考虑到正确执行此操作所需的所有工作,我可能会建议您考虑使用完善的异步图像获取机制,例如SDWebImage、DFImageManager 或Kingfisher。查看提供异步图像加载的UIImageView
类别/扩展。自己正确完成所有这些工作并非易事,因此最好使用一些提供异步图像视图检索机制的现有库。
【讨论】:
我不推荐使用 SDWebImage,它已经过时了(没有 NSURLSession,仍然有自己失败的 GIF 引擎等),它有多个已知问题,并且不能很好地与 Swift 一起使用(没有可空性注释)。 是的,我在那场比赛中真的没有马,并添加了 Kingfisher 和您的 DFImageManager 作为替代品。我的主要观点是 OP 不应该自己写这个。 是的,这个问题已经解决了很多次了。您也可以将AFNetworking、AlamofireImage、PINRemoteImage 加入其中。由 OP 决定使用哪一个。以上是关于在 tableview 中显示下载的图像的主要内容,如果未能解决你的问题,请参考以下文章
异步下载后图像调整大小 AFNetworking UiTableView