Оптимизация памяти для сетевого альбома Nimbus
У меня есть приложение, которое использует контроллер представления, который расширяет NetworkPhotoAlbumViewController
который в свою очередь расширяется NIToolbarPhotoViewController
В основном он реализует все протоколы NI, такие как NIPhotoAlbumScrollViewDataSource
, NIPhotoScrubberViewDataSource
, NIOperationDelegate
, NIPhotoAlbumScrollViewDelegate
и единственная настройка didReceiveMemoryWarning
:
- (void) didReceiveMemoryWarning {
NSLog(@"Nimbus Photo Album memory warning");
[self.highQualityImageCache reduceMemoryUsage];
[self.thumbnailImageCache reduceMemoryUsage];
NSLog(@"Nimbus Photo Album end 0memory warning");
}
а также addOperation
чтобы уменьшить количество одновременных загрузок:
-(void) addOperation: (AFImageRequestOperation *) operation {
NSLog(@"operation queue size is %d", _queue.operationCount);
BOOL found = NO;
for (AFImageRequestOperation *op in _queue.operations) {
if(!operation.isCancelled && [[operation.request.URL absoluteString] compare:[op.request.URL absoluteString]] == NSOrderedSame) {
NSLog(@"found the same operation");
found = YES;
break;
}
}
if(found) return;
NSInteger cancelledCount = 0;
if (_queue.operationCount > 5) {
for (NSOperation *operation in _queue.operations) {
if (operation.isCancelled) {
cancelledCount ++;
}
}
}
NSLog(@"cancelled operation count is %d", cancelledCount);
NSInteger count = _queue.operationCount;
if(count - cancelledCount > 5) {
for (NSOperation *operation in _queue.operations) {
if(!operation.isCancelled) {
NSLog(@"cancel operation");
[operation cancel];
break;
}
}
}
NSLog(@"operation is added into queue");
[_queue addOperation:operation];
}
Приложение также использует AVFoundation для захвата фотографий, которые отправляются с полным разрешением на сервер (и загружаются позже в сетевой альбом).
Проблема в том, что если я использую NetworkPhotoAlbumViewController
и затем переключитесь на захват фотографий, довольно часто приложение вылетает из-за нехватки памяти (объем памяти приложения может достигать 20-30 МБ), даже если didReceiveMemoryWarning
а также reduceMemoryUsage
называются.
Возможно ли, что я делаю что-то не так, и память не очищается правильно? Является ли проблема вызвана AFNetworking
? И какие альтернативы есть загрузка некоторых изображений из Интернета и отображение их в фотоальбоме с загрузкой миниатюр, панорамированием и масштабированием?