2012-04-04 4 views
0

Привет, У меня были проблемы с загрузкой изображений быстро на экран. Там, кажется, задержка в первый раз я попал в точку зрения:iphone - image loading

Вот как я загружаю изображения:

for (int i = 1; i < 19; i++) 
{ 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_Hole%d_", courseName, i]]; 
    imageView = [[UIImageView alloc] initWithImage:image]; 
    frame.origin.x = cx; 
    imageView.frame = frame; 
    [scrollView addSubview:imageView]; 
    cx += scrollView.frame.size.width; 
    imageView = nil; 
} 

Каждое изображение 640 х 820.

+0

Почему бы вам не ожидатьвкуть мимо 19 640x820 картинок, чтобы прослушать просмотр? Кроме того, меня беспокоит использование памяти всеми этими изображениями. Вы думали о ленивых изображениях только по мере того, как они нужны на экране? –

ответ

0

Я не думаю, что там намного больше вы можете сделать, чтобы ускорить это.

Однако у вас есть проблема с управлением памятью, которая может в некоторой степени ускорить процесс.

for (int i = 1; i < 19; i++)  { 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_Hole%d_", courseName, i]]; 
    imageView = [[UIImageView alloc] initWithImage:image]; 
    frame.origin.x = cx; 
    imageView.frame = frame; 
    [scrollView addSubview:imageView]; 
    cx += scrollView.frame.size.width; 
    [imageView release]; 
} 
+2

Если OP использует ARC, то вызов 'release' является ошибкой, а исходный код подходит для управления памятью. –

0

Да, для загрузки изображений требуется определенное время. У вас большое количество больших изображений, поэтому ожидается результат. Попробуйте подумать о слое черепицы вместо добавления UIImages для просмотра прокрутки. CATiledLayer может помочь вам

+0

любые примеры, которые могли бы мне помочь? – Mikerizzo

2

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

Кстати, imagedNamed: внутренне кэширует изображения, что, вероятно, объясняет, почему последующие нагрузки бывают быстрыми.

Если плитка не является вариантом (как рекомендовал @Krio), вы можете попробовать предварительно загрузить изображения в кеш на фоновом потоке до того, как ваш вид будет необходим. Например, если это представление обычно обращается из другого представления, вы можете начать серию вызовов imageNamed:, завернутых в dispatch_async или NSOperationQueue, когда загружается более ранний вид. Это могло бы помочь только в определенных обстоятельствах:

-Вы знаете, что ваш образ почти всегда является следующим элементом пользовательского интерфейса, который требуется запросить.

-Вы знаете заранее, какие активы необходимо загрузить.

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

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

0

Hi Image loading freezes UI. Вы можете выполнить эту задачу в фоновом режиме, чтобы пользовательский интерфейс никогда не был фризе. Попробуйте код ниже.

-(void)loadImages{ 
     [self performSelectorInBackground:@selector(loadImagesInBackGround) withObject:nil]; 
    } 

    -(void)loadImagesInBackGround{ 

     for (int i = 1; i < 19; i++) 
    { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_Hole%d_", courseName, i]]; 
     imageView = [[UIImageView alloc] initWithImage:image]; 
     frame.origin.x = cx; 
     imageView.frame = frame; 
     [scrollView addSubview:imageView]; 
     cx += scrollView.frame.size.width; 
     imageView = nil; 
    } 

} 

Вы должны вызвать loadImages: откуда вы собираетесь загружать изображения. В качестве альтернативы вы можете попробовать Grand Central Dipatch (GCD) для загрузки изображений на заднем плане.