Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Как оптимизировать код objective-c?

Проблема заключается в том, что моё приложение жрёт много оперативной памяти (300 мб). На 4s приложение вылетает, на остальных, кроме 6 и 6+ виснет. В приложении много картинок и таблиц с картинками. Мне нужно снизить нагрузку на оперативную память, как-то иначе грузить картинки с сервера. Вот код, как сейчас реализована загрузка картинок:
NSString *filePath1 = [NSString stringWithFormat:@"%@",responsePhotos[0]]; NSURL *imgurl=[NSURL URLWithString:filePath1]; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^{ NSData *dataimage1 = [NSData dataWithContentsOfURL:imgurl]; UIImage *imim1 = [UIImage imageWithData:dataimage1]; dispatch_async(dispatch_get_main_queue(), ^{ if (imim1==nil) { cell.imgauto1.image=[UIImage imageNamed:@"camera_a.gif"]; }else{ cell.imgauto1.image=imim1; } }); });


Ответ

Вы очень плохо все делаете,так нельзя делать, делать загрузку картинки, потом сразу же ее в ячейку ложить. Для загрузки изображений и их кеширования используйте SDWebImageCash, очень простая библиотека, и очень хорошо написана, либо же, напишите свое кеширование, но записывать картинки вручную, тем более как я понимаю в методе делегата таблицы, это очень плохо. Можно еще использовать CoreData, для хранения тех же изображений. Теперь по поводу архитектуры, и как правильно сделать, вы загружаете изображения в методе создания ячеек - убираем это от туда, это метод только для передачи в ячейки уже готовой информации. В методе viewDidLoad вы должны загрузить часть изображений, и уже передать их скачанные в ячейку, и назначить. Почему часть, потому что качать например 100 картинок, это значит что пользователь будет все это время ждать их загрузки, тоже плохо, используйте infinityscroll и pulltorefresh, принцип такой:дойдя до конца таблицы, 10 ячейки, например, начните загрузку еще 10 штук, и потом обновите таблицу.

Комментариев нет:

Отправить комментарий