【问题标题】:Create Image Array with Images in Cache (Swift)使用缓存中的图像创建图像数组 (Swift)
【发布时间】:2016-11-30 15:39:18
【问题描述】:

我对 iOS 比较陌生,如果在使用扩展程序来帮助管理下载和缓存时,我希望能帮助我弄清楚如何创建图像数组。我已经在这个圈子里转了几个小时,所以认为是时候利用智囊团了。

我创建了 UIImageView 的扩展,以便像这样下载和缓存图像:

let imageCache = NSCache()

extension UIImageView {

func loadImageUsingCacheWithURLString(url: NSURL) {

    self.image = nil

    // First check if there is an image in the cache
    if let cachedImage = imageCache.objectForKey(url) as? UIImage {

        self.image = cachedImage

        return
    }

    else {
    // Otherwise download image using the url location in Google Firebase
    NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) in

        if error != nil {
            print(error)
        }
        else {
            dispatch_async(dispatch_get_main_queue(), {

                // Cache to image so it doesn't need to be reloaded every time the user scrolls and table cells are re-used.
                if let downloadedImage = UIImage(data: data!) {

                    imageCache.setObject(downloadedImage, forKey: url)
                    self.image = downloadedImage

                }
            })
        }
    }).resume()
    }
}

...所以它非常适合加载集合视图图像。但是,我还想捕获一组图像,这样我就可以将它传递给另一个视图控制器,而无需再次下载所有内容(浪费数据)。我创建了另一个函数来执行此操作,但 imageholder.image 始终为零。我不认为这是一个异步问题,因为此时所有图像都被缓存了,当我调试时,我永远无法让它不为零。

var imageHolder: UIImageView!
var imagesArray:[UIImage] = [UIImage]()

// Function to create images array to use on the photo view.
func createImagesArray() {

    for url in imagesURLArray {

        imageHolder.loadImageUsingCacheWithURLString(url)

        if imageHolder.image != nil {

        imagesArray.append(imageHolder.image!)
        }

    }
}

感觉好像我错过了一些简单的东西,但我被卡住了。谢谢!

【问题讨论】:

标签: ios swift caching firebase-storage swift-extensions


【解决方案1】:

我最终为返回 UIImage 的扩展创建了另一个函数。这样做之后,附加到 imagesArray 没有问题。

let imageCache = NSCache()
var returnImage:UIImage = UIImage()

func returnImageUsingCacheWithURLString(url: NSURL) -> (UIImage) {

    // First check if there is an image in the cache
    if let cachedImage = imageCache.objectForKey(url) as? UIImage {

        return cachedImage
    }

    else {
        // Otherwise download image using the url location in Google Firebase
        NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) in

            if error != nil {
                print(error)
            }
            else {
                dispatch_async(dispatch_get_main_queue(), {

                    // Cache to image so it doesn't need to be reloaded everytime the user scrolls and table cells are re-used.
                    if let downloadedImage = UIImage(data: data!) {

                        imageCache.setObject(downloadedImage, forKey: url)
                        returnImage = downloadedImage

                    }
                })
            }
        }).resume()
        return returnImage
    }
}

【讨论】:

    【解决方案2】:
    let imageCache = NSCache()
    let images:[UIImages] = []
    
    extension UIImageView {
    
    func loadImageUsingCacheWithURLString(url: NSURL) {
    
        self.image = nil
    
        // First check if there is an image in the cache
        if let cachedImage = imageCache.objectForKey(url) as? UIImage {
    
            self.image = cachedImage
    
            return
        }
    
        else {
        // Otherwise download image using the url location in Google Firebase
        NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) in
    
            if error != nil {
                print(error)
            }
            else {
                dispatch_async(dispatch_get_main_queue(), {
    
                    // Cache to image so it doesn't need to be reloaded every time the user scrolls and table cells are re-used.
                    if let downloadedImage = UIImage(data: data!) {
    
                        imageCache.setObject(downloadedImage, forKey: url)
                        self.image = downloadedImage
    
                    }
                })
            }
            }).resume()
        }
        //Creat array and append the last image to it. 
        self.images.append(self.image)
    }
    

    【讨论】:

    • 不幸的是,我没有关注。我看到你添加了 let images:[UIImages] = [] (typo: UIImage)。
    • 是的,错字,我的错。然后在底部,只需将图像添加到数组中即可。
    • 所以所有发生的事情就是在你调用self.image = ... 之后将图像保存到一个数组中。 badaboom badabang
    • 啊,我明白了。有道理,但我实际上需要做两个单独的调用,因为我在构建此数组之前对 URL 数组(未显示)进行排序以匹配特定顺序。第一关我没说清楚。我想我仍然可以作为第二次调用来覆盖第一个数组。也就是说,我想我想出了一个解决方案,所以在一分钟内发布......
    猜你喜欢
    • 2018-06-11
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2015-12-11
    • 2017-04-13
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多