#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.