2012-11-05 22 views
1

我想將一些圖像加載到背景中。目前我在後臺加載UIImage,但是從我讀過的內容來看,這不是建議的做法,而應該在後臺加載CGImageRef,然後在主線程中加載UIImage。來自NSData的CGImageRef爲null,但UIImage不是?

問題是,當我嘗試創建一個CGImageRef時,它回來爲空。示例代碼:

NSData * imageData = [NSData dataWithContentsOfFile: coverPath]; 
if(nil != imageData) 
{ 
    UIImage * uiImage = [UIImage imageWithData: imageData]; 

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef) imageData); 
    CGImageRef imageRef = CGImageCreateWithPNGDataProvider(provider, NULL, true, kCGRenderingIntentDefault); 

    NSLog(@"Test: %p, %p", imageRef, uiImage); 
    CGDataProviderRelease(provider); 
} 

其中註銷Test: 0x0, 0x1c566bb0。這意味着imageRef爲空,但uiImage不是。任何想法我在這裏做錯了嗎?看起來好像這應該很簡單?

+1

只是[iOS 4.0中的新增功能]的一個附註(https://developer.apple.com/library/ios/#releasenotes/General/WhatsNewIniPhoneOS/Articles/iPhoneOS4.html) '繪製到圖形上下文在UIKit中現在是線程安全的。具體而言:用於訪問和操作圖形上下文的例程現在可以正確處理駐留在不同線程上的上下文。字符串和圖像繪製現在是線程安全的。在多線程中使用顏色和字體對象現在是安全的。如果繪圖是線程安全的,您可以直接在後臺使用UIImage進行(僅)加載。 – Masa

+0

這比試圖找出爲什麼我無法使imageRef工作更好!雖然我會保持開放的答案,因爲我仍然想知道解決方案:) – Kyle

+0

您是否曾經檢查過'提供程序'是否可能會返回零? –

回答

4
CGImageCreateWithPNGDataProvider() 

nil返回如果所提供的數據不是在PNG格式(例如JPEG或TIFF)。

[UIImage imageWithData: imageData] 

返回所有支持的圖像文件格式(PNG,JPEG,TIFF等)的圖像

這就解釋了爲什麼而第二個成功的第一個函數可能會失敗。