HanekeSwift не может выделить память
Я извлекаю около 136 изображений, каждое размером около 500 КБ, чтобы они кэшировались на диске.
После загрузки изображения № 98 я начинаю получать следующую ошибку для оставленных изображений (что заставляет меня думать, что они не кэшируются).
2015-07-29 09:52:44.471 MyProject[299:3418965] [HANEKE][ERROR] Failed to get data for key https://s3.amazonaws.com/my_bucket/my_image_n_99.jpg
Jul 29 09:52:45 my.host.net MyProject[299] <Error>: CGBitmapContextInfoCreate: unable to allocate 31492608 bytes for bitmap data
MyProject(299,0xb039f000) malloc: *** mach_vm_map(size=31494144) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Моим первым предположением было заполнение кеша памяти, поэтому я назвал HanekeSwiftCache.onMemoryWarning()
(пришлось сделать это public
) поскольку имеет следующую реализацию:
for (_, (_, memoryCache, _)) in self.formats {
memoryCache.removeAllObjects()
}
Но даже если я это назвал (и, возможно, он должен очистить кэш памяти), я все равно получаю сообщение об ошибке, поэтому я не знаю, что не так.
Есть идеи?
1 ответ
У меня была та же проблема, и я сделал, как и вы, сделал Cache.onMemoryWarning() публичным, а затем вызвал Shared.imageCache.onMemoryWarning() в методе didRecieveMemoryWarning ().
И это сработало!
Для меня предыдущие ответы улучшились, но не полностью решили мои проблемы с нехваткой памяти. Я мог бы даже заставить приложение аварийно завершить работу, не успев напечатать предупреждение о памяти на консоли.
В моем приложении было два кеша Haneke. Кеш UIImage и кеш данных. Когда они оба одновременно получали значительные объемы данных, они, похоже, не могли контролировать память.
Я удалил свой кеш UIImage и использовал только свой общий кеш данных. Везде, где выборка имела дело с URL-адресами изображения и хотела UIImage, я принудил данные к UIImagelet image = UIImage(data: data)!
а остальная часть моего кода работала как раньше.
Пока мне кажется, что это намного более стабильно при одновременной загрузке сотен изображений и видеофайлов.
Для причудливых встроенных помощников изображений требуется кеш UIImage. Вы можете вернуться к тому же старому поведению, расширив UIImage самостоятельно, скопировав код для помощников из Haneke, подключившись к вашему кешу данных и выполнив необходимое принуждение.