3

UIImageViewを使用してアニメーションGIF画像を表示するコードがあります:https ://github.com/amleszk/GifBlocking

特定の種類のGIF画像に問題がありますが、99%のケースでうまく機能します。例は、http://i.imgur.com/mbImw.gifにあります。

このgifは、101枚の画像を正常に受信し、アニメーション画像を含むUIImageViewを表示するときにメインスレッドをブロックします。圧縮されている場合はgifを解凍しても問題ありませんが、これでメインスレッドがブロックされないようにするにはどうすればよいですか?

メインスレッドで呼び出されるメソッドは次のとおりです。 DGifDecompressInput DGifDecompressLine copyImageBlockSetGIF

問題は、ビューが階層に追加されたときにgifの解凍が発生することです。これは、メインスレッドで実行する必要があります。

ありがとう

4

3 に答える 3

6

grasGendarmeのコードは便利ですが、UIImageは遅延しており、本当に必要になるまで画像をデコードしないことに注意してください。重要なのは、を使用してバックグラウンドスレッドで強制的に解凍する必要があるということですCGContextDrawImage。したがって、UIImage + JTImageDecode.hを使用して、バックグラウンドで非圧縮の画像バージョンを作成し、それをメインスレッドに戻します。

于 2013-03-24T18:22:41.587 に答える
2

実際のコードを見るのは素晴らしいことです。それがなければ、私たちの助けは限られています。

多分あなたは一線を引くことができます:

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

または、ライブラリを変更して、バックグラウンドスレッドでGIFを解凍してからsetNeedsDisplay、メインスレッドで使用します。

于 2013-03-24T15:37:06.247 に答える
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)
            // ...
    });
});
于 2013-03-24T15:44:19.957 に答える