iOS 图片 [翠鸟 || AlamofireImage] "Terminated due to memory issue"
iOS image [Kingfisher || AlamofireImage] "Terminated due to memory issue"
所以我的应用程序仅在 CollectionView 中显示图像,并且由于内存问题而崩溃。这是内存图
这是您可以检查的示例项目。 ImageTest
我用 Kingfisher Library 和 AlamofireImage Library 试过这个同一个项目,但都崩溃了。
看来问题可能是因为你的图片太大了。我看到两个解决方案。
PINRemoteImage
尝试使用 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)
}
缩放图像
使用 中的代码。您应该缩放到您需要的图像大小,而不是更多。
存储图像
让我们倒退一点。我会让所有这些代码由 class、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)
}
所以我的应用程序仅在 CollectionView 中显示图像,并且由于内存问题而崩溃。这是内存图
这是您可以检查的示例项目。 ImageTest
我用 Kingfisher Library 和 AlamofireImage Library 试过这个同一个项目,但都崩溃了。
看来问题可能是因为你的图片太大了。我看到两个解决方案。
PINRemoteImage
尝试使用 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)
}
缩放图像
使用
存储图像
让我们倒退一点。我会让所有这些代码由 class、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)
}