2013-03-24 3 views
2

У меня есть некоторый код для отображения анимированных GIF изображения с помощью UIImageView, здесь: https://github.com/amleszk/GifBlockingИзбегайте изображения декомпрессии блокирования основного потока

Это хорошо работает для 99% случаев, хотя есть проблема с определенным типом Изображение GIF. Пример можно найти здесь: http://i.imgur.com/mbImw.gif

Этот gif получает 101 изображение в порядке, затем блокирует основной поток, когда приходит время, чтобы отобразить UIImageView, содержащий анимированные изображения. Его прекрасный способ распаковать gif, если он имеет сжатие, но как бы остановить эту блокировку основного потока?

Методы, которые получают вызываемую в основном потоке является DGifDecompressInput DGifDecompressLine copyImageBlockSetGIF

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

Thanks

+1

* «код, похожий на ...» * довольно расплывчатый. Трудно помочь, не видя точного кода. –

+0

Добавлен git repo для воспроизведения здесь: https://github.com/amleszk/GifBlocking – amleszk

ответ

5

код grasGendarme является полезным, но обратите внимание, что UIImage ленив и не будет декодировать изображение до тех пор, пока на самом деле необходимо. Ключ в том, что вам нужно принудительно декомпрессировать фоновый поток, используя CGContextDrawImage. Поэтому используйте UIImage+JTImageDecode.h, чтобы создать версию несжатого изображения на заднем плане, а затем верните ее в основной поток.

+0

Хорошо работает (обратная сторона изображения отображается дважды?), Git repo был обновлен примером. – amleszk

+0

Рендеринг означает создание изображения из форматированных данных. Здесь изображение отображается (распаковывается) один раз, затем сохраняется в объекте UIImage и затем выгружается в видеопамять. Если вы сделаете это в два этапа или один, изображение будет отображаться только один раз. – Jano

+0

Я пробовал это, и мой якобы анимированный UIimage больше не анимирован, он просто показывает первый кадр - что-нибудь еще, что я пропускаю? –

2

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

Может быть, вы можете поместить строку:

[self performSelectorInBackground:@selector(yourBlockingMethod:) withObject:yourObject]; 

Или изменить вашу библиотеку, чтобы распаковать GIF в фоновом потоке, а затем использовать setNeedsDisplay в главном потоке.

2

Вы могли бы сделать все, что произойдет в отдельном потоке с использованием Grand Central Dispatch и последовательные очереди:

// create the queue that will process your data: 
dispatch_queue_t dataProcessQueue = dispatch_queue_create("data process queue", NULL); // the name is there for debugging purposes 
    //dispatch to the newly created queue, and do not wait for it to complete 
    dispatch_async(dataProcessQueue, ^{ 
     // load and decode gif 
     // ... 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // put gif in place (UI work always happen on the main queue) 
      // ... 
    }); 
});