2015-04-08 1 views
0

Я загружаю несколько файлов изображений из Интернета с помощью SDWebImageManager. Я могу скачивать файлы с разрешением 2050 x 3500. Ниже мой код жеСбой SDWebImageManager при загрузке файлов с большим разрешением изображений

SomeObj *limgObj = [imageinfoArray objectAtIndex:count]; 
    __weak UIImageView *thumbImg_ = bannerImgView; 
    __weak typeof(self) weakSelf = self; 

SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
manager.delegate = weakSelf; 

if([limgObj.imageUrl length] > 0) { 

[manager downloadWithURL:[NSURL URLWithString:limgObj.imageUrl] options:0 progress:^(NSUInteger receivedSize, long  long expectedSize) 
{ 
    [MMProgressHUD showWithTitle:@"" status:@"Processing.."]; 
} completed:^(UIImage *image,NSError *error, SDImageCacheType cacheType, BOOL finished) { 
    thumbImg_.image = image; 
    [MMProgressHUD dismiss]; 
}]; 
} 

И если ширина или высоту изображения будет больше, чем 2000 год я его обработку в методе делегата понизить его перед Кэшированием нижеперечисленных

- (UIImage *)imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL 
{ 
    NSLog(@"ORIGINAL - > width -> %f height - >%f", image.size.width, image.size.height); 


    if (image.size.width > 2000 && image.size.width < 3000) { 
     CGSize newSize = CGSizeMake(image.size.width/1.5, image.size.height/1.5); 
     UIGraphicsBeginImageContextWithOptions(newSize, NO, 1.0); 
     [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
     UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
     NSLog(@"NEW - > width -> %f height - >%f", newImage.size.width, newImage.size.height); 
     UIGraphicsEndImageContext(); 
     return newImage; 
    }.....>Multiple cases handled for bigger images omitted to make small code here 
    return image; 
} 

Но для изображений, как 4961 × 7016 которые являются только 557kb, размер моего приложения падает с предупреждением о давлении памяти, даже не вызывающим мою функцию делегата transformDownloadedImage и давая мне шанс понизить его до кэширования.

Пожалуйста, помогите мне выяснить, что я делаю неправильно здесь, и почему SDWebImageManager не может скачать изображение с высоким разрешением на первом месте.

Благодаря

ответ

-1

Смотрите в яблочном документации:

изображений и управления памятью В ситуациях с низким уровнем памяти, данные изображения могут быть удалены из объекта UIImage чтобы освободить память системы. Это поведение очистки влияет только на данные изображения, хранящиеся внутри объекта UIImage, а не на сам объект. При попытке нарисовать изображение, данные которого были очищены, объект изображения автоматически перезагружает данные из его исходного файла. Однако этот дополнительный шаг загрузки может привести к небольшому штрафу за производительность.

Вам не следует создавать объекты UIImage размером более 1024 x 1024. Помимо большого объема памяти, которое будет потреблять такой образ, вы можете столкнуться с проблемами при использовании изображения в качестве текстуры в OpenGL ES или при рисовании изображения на вид или слой. Это ограничение размера не применяется, если вы выполняете манипуляции на основе кода, например, изменяя размер изображения более 1024 x 1024 пикселей, рисуя его в графическом контексте с поддержкой растровой графики. Фактически, вам может потребоваться изменить размер изображения таким образом (или разбить его на несколько меньших изображений), чтобы привлечь его к одному из ваших представлений.

Apple, документация очень полезна в некоторых случаях: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/doc/c_ref/UIImage

+0

Эта информация будет действительна еще в 2007 году, но это 2015 здесь и iPhone 6+ имеет разрешение более 2k пикселей, и даже iPhone 4S поддерживает 4k текстуры. – Andy

+0

Часть документации была обновлена ​​менее 5 месяцев назад (см. Ссылку, которую я опубликовал: «Обновлено: 2015-01-12»). Хороший совет для вас, прочитайте дополнительную документацию по железу, прежде чем оценивать другие сообщения. – Elidemir

+0

Я читаю их документацию последние 5 лет. Этот параграф существует уже много лет с момента выхода iOS 3.0 или, возможно, раньше. Обычно вам необходимо свести к минимуму все тяжелые операции на устройстве, но 1024 больше не ограничивается. – Andy