ios - 使用缓存中的图像创建图像数组 (Swift)

标签 ios swift caching firebase-storage swift-extensions

我是 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()
    }
}

...所以这非常适合加载 Collection View 图像。但是,我还想捕获一组图像,这样我就可以将它传递到另一个 View Controller ,而不需要再次下载所有内容(浪费数据)。我创建了另一个函数来执行此操作,但 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!)
        }

    }
}

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

最佳答案

我最终为返回 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
    }
}

关于ios - 使用缓存中的图像创建图像数组 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38599206/

相关文章:

c# - System.Net.Http.HttpClient缓存

java - JCS 1.3 关机后从磁盘刷新缓存

ios - 比较 UIButton 选择状态的内容

iOS:首次运行应用程序期间的 NSUserDefaults?

ios - GPUImage 和 GPUImageView : App terminated due to memory error

swift - 比较 Swift 类层次结构中的协议(protocol)

ios - CoreData fetch() 返回无序的对象

java - Spring data-修改查询和ehcache(缓存)

iphone - SVProgressHUD - 禁用用户交互

ios - 设置后关闭 ShortcutViewController