在tableview

时间:2015-09-15 19:49:16

标签: ios swift uitableview

我在Swift 2.0中制作了一个应用程序,我在原型单元格中使用带有图像视图的表格视图。该应用程序从Facebook服务器下载一些图像,我想显示它们。这些图片都是从不同的网址下载的,所以我正在使用一个程序来循环播放和下载,就像我用名字一样从互联网上显示它们并显示,但我有点卡住了..

 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这样的事情,但每个用户需要有所不同。有了名字,我用数组做了这个,但这并不是我假设的图像。

帮助非常感谢大家! 谢谢!

2 个答案:

答案 0 :(得分:0)

您通常不希望像这样加载所有图像。你肯定不想在每个图像之后重新加载整个表格(因为这会导致它滚动回到tableview的顶部)。

通常建议懒惰地获取图像(即直到他们需要)。您可以从fetchPicture调用cellForRowAtindexPath,然后在完成处理程序中相应地更新单元格的图像视图。

但是你需要担心一些细节:

  • 首先,在完成提取时,单元格可能已被重用,因此您必须检查以确保单元格仍然可见。

  • 其次,我建议使用NSCache而不是使用数组,并确保在内存压力下清除此缓存。您可能还希望缓存到持久存储,但有些人更喜欢依赖NSURLCache机制

  • 第三,如果单元格滚出视图,您可能希望取消该请求(例如,如果您快速滚动到第100行,该图像请求不会被追溯到后面对不再可见的单元格的其他99个图像请求。

就个人而言,考虑到正确执行此操作所需的所有工作,我建议您考虑使用完善的异步图像提取机制,例如SDWebImageDFImageManagerKingfisher。查看提供异步图像加载的UIImageView类别/扩展。要自己做好这一切是非常重要的练习,所以最好使用一些提供异步图像视图检索机制的现有库。

答案 1 :(得分:0)

您通常希望使用专门针对这类内容的框架。我建议使用SDWebImage,它已经过时(没有NSURLSession),有很多未解决的问题,并且不能很好地使用Swift(没有可空性注释)。

看看这两个与iOS平台最新的库:

  • DFImageManager - 用Objective-C编写的高级框架,但具有可空性注释(适用于Swift)。这里的list of things比SDWebImage更好。 披露由我撰写,意见可能有偏见。
  • Kingfisher - 用Swift编写的轻量级库。与SDWebImage类似,但SDWebImage和DFImageManager的功能要少得多。