Ленивая загрузка UIImages из файлов без блокировки основного потока? - PullRequest
5 голосов
/ 18 августа 2010

Какой приличный способ загружать UIImages по требованию, не блокируя основной поток?

Контекст: у меня есть пара тысяч изображений на стене, которые я могу прокручивать.Очевидно, что невозможно просто загрузить все UIImages, поэтому сейчас я просто лениво загружаю отображаемые объекты, а затем освобождаю их, когда они больше не нужны.Проблема в том, что загрузка UIImages из файлов занимает заметное время, достаточно продолжительное, чтобы вызвать заикание при прокрутке.Это ни в коем случае не большие изображения (около 250x250, может быть, 20-30 КБ каждое), но они все равно вызывают заикание.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2013

Вы можете сделать это очень просто.Сначала создайте очередь при создании объекта UIScrollView.После создания вы можете загрузить изображение из локального хранилища с только что созданной очередью.

//get a dispatch queue
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


//this will start the image loading in bg
dispatch_async(concurrentQueue, ^{        
    NSData *image = [[NSData alloc] initWithContentsOfURL:imageURL];

    //this will set the image when loading is finished
    dispatch_async(dispatch_get_main_queue(), ^{
        imageView.image = [UIImage imageWithData:image];
    });
});  
0 голосов
/ 04 мая 2011

Я использую пользовательский подкласс UIImageView для чего-то похожего на это. Он в основном используется для загрузки изображений (например, аватары и изображения в потоковом твиттере), поэтому он использует NSURLConnection для загрузки изображения с URL-адреса. После этого URLConnection вызывает метод делегата, который я затем использую для обновления UIImageView. Дополнительно, я добавил позже, это статический словарь с кэшированными изображениями, поэтому изображения, которые используются чаще, не нужно загружать каждый раз. Это очень полезно для таких вещей, как аватары в Твиттере, упомянутые ранее.

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

...