iOS图片[Kingfisher || AlamofireImage]“由于内存问题而终止”

时间:2018-08-12 06:43:54

标签: ios sdwebimage alamofireimage kingfisher

因此,我的应用仅在CollectionView中显示图像,并且由于内存问题而崩溃。这是内存图 Memory Graph

这是您可以检查的示例项目。 ImageTest

我已经使用Kingfisher Library和AlamofireImage Library尝试了相同的项目,并且两者均崩溃。

1 个答案:

答案 0 :(得分:0)

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

PINRemoteImage

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

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

按比例缩小图像

由于您已经注意到,逐个缩放图像是手动操作(因此很繁琐),因此建议在客户端缩放。

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

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

下载图像

使用Alamofire从URL下载图像:

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

缩放图像

使用this answer on 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)
}