从 URL 循环下载图像以用于集合视图

Egg*_*ead 5 url networking image ios swift

我正在尝试创建图像的集合视图。我已经试过这些解决方案,下载图像:
一个
2
3

4

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()
                }
Run Code Online (Sandbox Code Playgroud)

但我无法让它显示图像。我是 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
    }
Run Code Online (Sandbox Code Playgroud)

ish*_*haq 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()
                    }
                })
            }
Run Code Online (Sandbox Code Playgroud)

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