【问题标题】:Download image from URL in loop for collection view从 URL 循环下载图像以获取集合视图
【发布时间】:2016-05-02 21:36:46
【问题描述】:

我正在尝试创建图像的集合视图。 我已经尝试了这些解决方案来下载图像:
one
two
three
还有
four

var tempObject = json["photos"]
                for var i = 0; i < tempObject.count; i++
                {
                    var tempImage = UIImage()

                    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

                        tempImage =  UIImage(data: NSData(contentsOfURL: NSURL(string:"https://developer.apple.com/swift/images/swift-og.png")!)!)!
                    })

                    swiftImages.insert(tempImage, atIndex: i)
                }

                dispatch_async(dispatch_get_main_queue()) {

                    self.collectionView?.reloadData()
                }

但我无法让它显示图像。我是 swift 网络新手。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! ImageCollectionViewCell
        cell.imageView.image = swiftImages[indexPath.row]
        return cell
    }

【问题讨论】:

    标签: ios swift image url networking


    【解决方案1】:

    这段代码有问题:

                    var tempImage = UIImage()
    
                    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    
                        tempImage =  UIImage(data: NSData(contentsOfURL: NSURL(string:"https://developer.apple.com/swift/images/swift-og.png")!)!)!
                    })
    
                    swiftImages.insert(tempImage, atIndex: i)
    

    tempImage 始终为空,因为下载是异步的,您在下载完成之前将其插入到 swiftImages。

    我建议您使用一些库,例如 SDWebImage。您不必手动进行下载。使用起来超级简单,而且您可以免费获得所有网络:

    import SDWebImage
    
    let imageView = UIImageView()
    imageView.sd_setImageWithURL( ... url ... )
    

    【讨论】:

    • 不是基于 SDWebImage Objective C 的吗?如果有人开始使用 Swift 应用程序,我认为最好使用尽可能多的纯 Swift 库,AlamofireImage 很好地满足了图像加载要求。 (不要误会,我喜欢用于 Objective C 项目的 SDWebImage)。
    • 是的,这很有趣。当然,当您将它们用作嵌入式框架时,使用哪一个并不重要。你感觉不到区别......
    • 从 API 消费者的角度来看,您是对的。尽管您正在调试,并且单步执行调用嵌入式框架代码的代码,纯 Swift 框架意味着您不必从 Swift 脑切换到客观的 C 语法。更容易发现问题。
    【解决方案2】:

    您正在将UIImage()(在dispatch_async 块之前创建的那个)对象添加到swiftImages 数组。请注意dispatch_async 块在将来的某个时间执行,它不会在var tempImage = UIImage() 行之后立即执行。从调度块内部抓取图像,这也是您应该将调度发送到主队列以重新加载集合的地方。像这样更改您的代码:

                var tempObject = json["photos"]
                for var i = 0; i < tempObject.count; i++
                {
                    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    
                        var tempImage =  UIImage(data: NSData(contentsOfURL: NSURL(string:"https://developer.apple.com/swift/images/swift-og.png")!)!)!
                        swiftImages.insert(tempImage, atIndex: i)
                        dispatch_async(dispatch_get_main_queue()) {
    
                           self.collectionView?.reloadData()
                        }
                    })
                }
    

    顺便说一句,为集合视图或表格视图单元格加载图像不仅仅是读取图像,您可能会在一段时间内使用AlamofireImage 之类的东西。

    【讨论】:

    • 每次获得新图像时重新加载 tableview 并不是最聪明的主意
    • 当然,但是解释与表格和集合视图中的图像相关的所有良好实践超出了这个问题的范围。这就是为什么我推荐 AlamofireImage 让他开始。
    • 感谢使用 AlamofireImage
    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 2015-11-12
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多