Хобрук: Ваш путь к мастерству в программировании

код занимает больше времени, чем ожидалось

Мой код занимает больше времени, чем ожидалось. Как сократить время загрузки? Раньше это не занимало столько времени. Я не изменил код, и все же он замедлился. Мой код выглядит следующим образом:

for (i =1 ; i< [productList count]; i++) {
    UIImage *image;
    products *productItem = [productList objectAtIndex:i-1];
    if(![productItem.productItemPhoto isEqualToString:@""]){
        NSString *productItemPhoto = productItem.productItemPhoto;          
        NSData* data = [NSData dataWithContentsOfFile:productItemPhoto];
        image = [[UIImage alloc] initWithData:data];
    }
    else{
        if(numberOfProductsPerRow == 1)
            image = [UIImage imageNamed:@"no-image-2.png"];
        else
            image = [UIImage imageNamed:@"no-image-1.png"];
    }
    UIImageView *bg1;
    if(numberOfProductsPerRow == 1)
        bg1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image-box-s7.png"]];
    else            
        bg1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image-box-s4.png"]];
        bg1.frame = CGRectMake(x, y,width, height);
        [productScrollView addSubview:bg1];

        UIButton *pro1 = [[UIButton alloc] initWithFrame:CGRectMake(x+spacingX, y+spacingY-15, btnWidth, btnHeight)];

    [pro1 setImage:image forState:UIControlStateNormal];

        [pro1 setTag:i];
        [pro1 addTarget:self action:@selector(selectProduct:) forControlEvents:UIControlEventTouchUpInside];
        [productScrollView addSubview:pro1 ];

        UILabel *lblProductModel = [[UILabel alloc] initWithFrame:CGRectMake(0, height - 40, width, 30)];
        lblProductModel.backgroundColor = [UIColor clearColor];
        lblProductModel.textAlignment = UITextAlignmentCenter;
        lblProductModel.textColor = [UIColor colorWithRed:1.0 green:0.8 blue:0.0 alpha:1];
        NSString *price;

        if([userSettings.priceToShow isEqualToString:@"WholesalePrice"])
            price = [NSString stringWithFormat:@"%@%.0f",productItem.productCurrencySymbol, productItem.productWholesalePrice];
        else if([userSettings.priceToShow isEqualToString:@"RetailsalePrice"])
            price = [NSString stringWithFormat:@"%@%.0f",productItem.productCurrencySymbol, productItem.productRetailSalesValue];
        else
            price = @"";
        lblProductModel.tag = [productList count] + i;
        lblProductModel.text = [NSString stringWithFormat:@"%@ %@", productItem.productModelCode,  price];
        [bg1 addSubview:lblProductModel];
        x = x + width + 10;
        if(i%numberOfProductsPerRow == 0){
            x = 20;
            y=y+height+10;
        }
        [pro1 release];
        [image release];
        [bg1 release];
        [lblProductModel release];

}
if((i-1)%numberOfProductsPerRow!=0)
    scrollViewParent.contentSize = CGSizeMake(0, y+height+spacingY);
else    
    scrollViewParent.contentSize = CGSizeMake(0, y + spacingY);
productScrollView.contentSize = scrollViewParent.contentSize;
[scrollViewParent addSubview:productScrollView];
}

Около 380 записей приходят в productList. Я не думаю, что это должно занять так много времени.


  • Сколько времени это занимает? Сколько времени вы ожидаете, что это займет? И как вы измеряете, сколько времени это занимает? 19.05.2011
  • Это занимает от 2 до 3 секунд. Оно должно быть в пределах доли секунды. 19.05.2011
  • Вы должны выполнять такую ​​длинную обработку в отдельном потоке. 19.05.2011
  • Если вы не изменили код, то должны измениться тестовые данные, например. большие изображения и т. д. Если все 380 записей содержат изображения, то 2-3 секунды на самом деле не так уж и много. 19.05.2011

Ответы:


1

Учитывая количество возни с UI* API в этом коде, этот код должен выполняться в основном потоке. Вы загружаете массу изображений в основной поток, а загрузка изображений — очень медленная и дорогая операция, сравнительно говоря.

Во-первых, вам действительно нужно загружать все 380 изображений в начале? Что произойдет, когда это число вырастет до 500, 1500 или 15 000? Могу поспорить, что вашему приложению не хватает памяти где-то между 380 и 15 000....

Ваш код должен загружать только те изображения, которые ему нужны, а затем делать это вне этого цикла. Все, что выполняется в основном потоке, будет блокировать взаимодействие с пользователем до тех пор, пока оно работает; идеально делать эти периоды времени как можно короче (или, в идеале, вообще не перемещая вычисления в фоновую очередь/поток).

19.05.2011
  • Я загрузил изображения на первый экран, т.е. 8 изображений за раз, а остальные изображения загружаются, когда пользователь прокручивает вниз. Теперь код работает нормально. 20.05.2011
  • Потрясающий; это звучит как гораздо более масштабируемый дизайн! В какой-то момент вам захочется подумать о выгрузке ранее загруженных изображений, чтобы убедиться, что вы не выбрасываете память (если количество изображений растет). 20.05.2011
  • В дополнение к этому я реализую разбиение на страницы, т.е. 100 изображений за раз. Размер изображений приводил к утечке памяти. Итак, нашел решение таким образом... :) 21.05.2011
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..