Инструменты Оптимизация UIImageView

Я загружаю кучу UIImages (которые являются локальными и предварительно загруженными с приложением) с помощью этого кода:

NSString*plistPath = [[NSBundle mainBundle] pathForResource:@"images" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:plistPath];
NSMutableArray *finalArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for(int i=0;i<array.count; i++) {
    [finalArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@",[array objectAtIndex:i]]]];
}

затем позже в collectionView:

cell.cellImage.image = [finalArray objectAtIndex:indexPath.row];

В представлении этого collectionView огромное отставание. Я зафиксировал это отставание с помощью следующих снимков экрана инструментов:

введите здесь описание изображения

Между этой задержкой (ощущаемой пользователем и показанной на графике) и фактическим деревом вызовов ниже, которое не показывает задержки, существует значительное расхождение. Я загружаю 500 тыс. jpg в каждую ячейку collectionView. Этот анализ инструментов в основном говорит, что я ничего не могу сделать в коде, и это задержка системной библиотеки?

РЕДАКТИРОВАТЬ: мой вопрос больше не касается этого конкретного варианта использования с моим collectionView. Речь об инструментах в целом. Если у меня выбраны параметры, которые я делаю на скриншоте, и приложение показывает значительное отставание, а профилировщик времени - нет, могу ли я что-нибудь сделать в своем коде, чтобы увеличить скорость? Думаю, я спрашиваю в более общем плане о профилировщике времени, настройках и их результатах. Если все отставание связано с кодом более низкого уровня или системными фреймворками, могу ли я что-нибудь с этим поделать?


person Eric    schedule 05.02.2013    source источник
comment
Не могли бы вы немного описать свой collectionView? Я предполагаю, что это один с маленьким размером ячейки?   -  person brynbodayle    schedule 16.02.2013
comment
пожалуйста, смотрите мое редактирование. Спасибо.   -  person Eric    schedule 18.02.2013


Ответы (3)


У вас включен флажок Hide System Libraries на правой панели настроек, поэтому он будет скрывать любые вызовы методов, которые вы не определили. Так, например, если вы сделаете кучу вызовов imageNamed: и у вас будет установлен этот флажок, вы не увидите время, которое требуется системе для распаковки и загрузки этих изображений.

Таким образом, технически все «задержки»/медленность связаны с системными фреймворками, но вы можете изменить то, как вы их используете. И вы также можете отслеживать, какие операции в системных фреймворках являются наиболее затратными по времени.

Снятие этого флажка является решением:

Снимите этот флажок

person brynbodayle    schedule 18.02.2013
comment
вот такой отзыв я и искал - person Eric; 18.02.2013

imageNamed: кэширует ваше изображение. Используйте ссылку imageWithContentsOfFile:, чтобы избежать кэширования.
Надеюсь, это ускорит вашу загрузку.

person Inder Kumar Rathore    schedule 05.02.2013
comment
похоже, не помогает: NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[array objectAtIndex:i]]; [finalArray addObject: [UIImage imageWithContentsOfFile: путь к файлу]]; - person Eric; 05.02.2013

Загружаете ли вы их в фоновом/отдельном потоке, если нет, то сделайте это, чтобы решить вашу проблему и загрузить их в очередь. Поэтому, как только изображение загружено, уведомите объект, который будет его использовать, и передайте ему объект изображения.

Создайте простую NSOperation, которая загружает изображение и уведомляет назначенного ему делегата. Создайте объект этого класса для каждого изображения, которое вы хотите загрузить, и добавьте его в NSOperationQueue и установите максимальное количество одновременных операций NSOperationQueue равным 1.

person SAPLogix    schedule 18.02.2013