Инструменти за оптимизация 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. Улових това забавяне със следните екранни снимки на инструменти:

въведете описание на изображението тук

Има голямо разминаване между това забавяне (изпитано от потребителя и показано на графиката) и действителното дърво на повикванията по-долу, което не показва забавяне. Зареждам 500k jpg във всяка клетка на collectionView. Този анализ на инструментите всъщност казва ли, че не мога да направя нищо в кода и това е забавяне на системната библиотека?

РЕДАКТИРАНЕ: Въпросът ми вече не е за този конкретен случай на употреба с моя collectionView. Става дума за инструменти като цяло. Ако съм избрал опциите, които правя в екранната снимка, и приложението показва значително забавяне, но профилиращият време не го прави, има ли нещо, което мога да направя в моя код, за да увелича скоростта? Предполагам, че питам по-общо за профилиращия време, настройките и техните резултати. Ако цялото забавяне се приписва на код от по-ниско ниво или системни рамки, мога ли да направя нещо по въпроса?


person Eric    schedule 05.02.2013    source източник
comment
Можете ли да опишете малко вашата колекцияView? Предполагам, че е с малък размер на клетката?   -  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:filePath]]; - person Eric; 05.02.2013

Зареждате ли ги на заден план/отделна нишка, ако не, моля, направете го, ще реши проблема ви и ще ги заредите в опашка. Така че след като изображението бъде заредено, уведомете обекта, който ще го използва, и му предайте обекта на изображението.

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

person SAPLogix    schedule 18.02.2013