Загрузка изображений с URL-адреса по-прежнему недостаточно быстрая с использованием фоновой очереди

#ios #objective-c #uiimageview #uiimage #dispatch-async

#iOS #objective-c #uiimageview #uiimage #отправка -асинхронная

Вопрос:

Я запустил фоновую очередь, чтобы сначала загрузить изображение, а затем обновить изображение UIImageView в основной очереди.

         int i = 0;
        for (UIImageView *imageView in self.featuredPhotoImageViewCollection) {
            dispatch_async(dispatch_queue_create("imageQueue", NULL), ^{
                NSURL *url = [NSURL URLWithString:[featuredPhotos[i] valueForKey:@"url"]];
                UIImage *image = [UIImage animatedImageWithAnimatedGIFURL:url];
                dispatch_async(dispatch_get_main_queue(), ^{
                    imageView.image = image;
                });
            });
            i  ;
        }
  

Тем не менее, это все еще недостаточно быстро. Задержка составляет 0,5 — 1 сек. Любое другое предложение, кроме использования фоновой очереди?

Ответ №1:

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

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

Обычно это 1) отображение индикатора загрузки, 2) фоновая очередь {сделайте что-нибудь 3) основная очередь { скрыть индикатор загрузки и обновить пользовательский интерфейс }}

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

Или предварительно загрузите все GIF-изображения где-нибудь еще и просто покажите их здесь. Загрузка нескольких изображений всегда занимает некоторое время.

Ответ №2:

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

Или вы можете загрузить изображение до перехода к просмотру, в котором оно отображается.

Ответ №3:

Если gif представляет собой большой файл, а сервер поддерживает многопоточную загрузку.Затем вы можете попробовать dispatch_group загрузить gif.