0

So my app only displays images in a CollectionView and it crashes because of memory issues. This is the memory graph Memory Graph

This is the sample project you can check. ImageTest

I've tried this same project with Kingfisher Library and AlamofireImage Library and it crashes on both.

4

1 回答 1

1

问题似乎是由您的图像太大引起的。我看到两个解决方案。

PIN远程图像

尝试使用PINRemoteImage。它在 ObjC 中,但您可以桥接到 Swift。这个框架允许你设置缓存大小的限制,这应该可以防止你的内存被吞噬。

但是,这可能无济于事,因为您最终可能没有所有图像。

缩小图像

因为,正如您所指出的,一张一张地缩放图像是手动的(因此很乏味),我建议在客户端进行缩放。

为此,您可能最终会编写自己的缓存代码。不过,我之前已经这样做过,我可以证明,获得满足您需求的东西实际上非常简单。例如,当我必须缓存图像时,我最终创建了一个字典,用于存储带有 url 键的图像。在将图像存储在字典中之前,将它们按比例缩小。

根据要求,这里有一些示例代码可以帮助您。这不是完整的代码,但它是一个非常坚实的基础。

下载图像

用于Alamofire从 URL 下载图像:

Alamofire.request(.GET, "https://robohash.org/123.png").response { (request, response, data, error) in
    self.myImageView.image = UIImage(data: data, scale:1)
}

缩放图像

在 SO 上使用此答案中的代码。您应该缩放到您需要图像的大小,仅此而已。

存储图像

让我们备份一下。我会让所有这些代码由一个类ImageManager,或类似的东西管理。

ImageManager应该有:

var delegate: ImageManagerDelegate?               // the delegate; more detail below
private(set) var images: [URL: UIImage] = [:]     // the cache

func getImage(from url: URL)                      // the entry point to the class; calls the delegate immediately if the image is already cached, else calls `downloadImage(url: url)`
private func downloadImage(url: URL)              // actually downloads the image; calls `cacheImage(url: url, image: downloadedImage)`
private func cacheImage(url: URL, image: UIImage) // caches the image in `images` with `url` as the key, and notifies `delegate` that an image has been cached with the specified url.

ImageManager还应该实施ImageManagerDelegate

protocol ImageManagerDelegate {
    func imageManager(_ manager: ImageManager, didGet image: UIImage, from url: URL)
}
于 2018-08-15T18:09:31.277 回答