在 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 中显示下载的图像的主要内容,如果未能解决你的问题,请参考以下文章

在 tableview 单元格中显示图像

CKAsset 不会显示在 tableview 图像中

无法重新排序 tableView 单元格图像

异步下载后图像调整大小 AFNetworking UiTableView

如何删除不可见的 tableview 单元格的下载图像。在ios中

在 tableview 中显示图像时 managedObjectModel 错误指令