2013-03-24 81 views
2

我有一些代碼使用一個UIImageView,這裏顯示的動畫GIF圖像:https://github.com/amleszk/GifBlocking避免圖像解壓縮阻塞主線程

它非常適用的情況下99%,雖與某種類型的問題GIF圖像,可以在這裏找到一個例子:http://i.imgur.com/mbImw.gif

這個gif接收101張圖像,然後在顯示包含動畫圖像的UIImageView時阻止主線程。如果它有壓縮,它可以解壓gif,但是如何阻止這個阻塞主線程?

是被調用在主線程的方法是 DGifDecompressInput DGifDecompressLine copyImageBlockSetGIF

問題是GIF當視圖被添加到層級減壓發生 - 這應該在主線程中完成

謝謝

+1

*「一些類似於...的代碼」非常模糊。沒有看到確切的代碼就很難提供幫助。 – 2013-03-24 13:23:53

+0

添加了一個git repo在這裏重現:https://github.com/amleszk/GifBlocking – amleszk 2013-03-24 16:32:44

回答

5

grasGendarme的代碼是有用的,但要注意的UIImage是懶惰和圖像,直到它真的不會解碼需要。關鍵是你必須使用CGContextDrawImage在後臺線程上強制解壓縮。因此,使用UIImage+JTImageDecode.h在後臺創建一個未壓縮的圖像版本,然後將其設置回主線程。

+0

工作正常(缺點是圖像渲染兩次?),git repo已經更新了一個例子。 – amleszk 2013-03-24 22:46:30

+0

渲染意味着從格式化數據生成圖像。在這裏,圖像被渲染(解壓縮)一次,然後保存在UIImage對象上,並稍後轉儲到視頻內存中。無論您是分兩步還是一步完成,圖像只會呈現一次。 – Jano 2013-03-24 23:01:22

+0

我試過這個,我所謂的動畫UIimage不再是動畫,它只是顯示第一幀 - 我忽略的其他東西? – 2013-03-27 21:45:55

2

這將是很高興看到實際的代碼。沒有這個,我們的幫助是有限的。

也許你可以把一條線:

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

或修改您的庫解壓縮在後臺線程的GIF,然後在主線程上使用setNeedsDisplay

2

你可以讓一切發生在使用大中央調度和串行隊列一個單獨的線程:

// 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) 
      // ... 
    }); 
});