2011-03-30 160 views
2

我試圖從URL加載的drawRect:內的圖像。我們的圖像加載代碼看起來像這樣的方法:- (void) loadImage:(NSURL*)url done:(void(^)(UIImage*))done;,這將創建一個異步NSURLConnection的和回調與圖像。使用GCD /異步代碼:

所以,我在drawRect:代碼如下所示:

CGContextRef context = UIGraphicsGetCurrentContext() 
[service loadImage:url done:^(UIImage * image){ 
    CGContextDrawImage(context, frame, image.CGImage); 
}]; 

不幸的是,這是行不通的。圖像從未繪製。

我也試着使用同步連接([NSData dataWithContentsOfUrl:]),但塊的線程和不必要的會減慢速度。我不想使用UIImageView。

這樣做的正確方法是什麼?謝謝!

+0

請讓我們知道您是如何解決這個問題,我堅持了同樣的問題。謝謝 – Vjy 2012-03-31 03:15:51

回答

3

我認爲正確的方法是預先加載圖像或通過調用「setNeedsDisplayInRect:」或通過單獨的方法進行自己的圖形處理來接收圖像,然後繪製圖像(iOS可能會阻止您儘管這樣做,我不知道)。很明顯,setNeedsDisplayInRect變體會要求你手頭有圖像以便第二次繪製(緩存)。

如果你異步加載圖像,你的drawRect方法在圖像加載前很可能已經退出,並且繪圖焦點不再鎖定在drawRect上,因此無法在上下文中繪製圖像。你有沒有嘗試設置一個斷點來驗證這一點?我對鎖定可能是錯誤的,但是我認爲我在某個時候讀了類似的東西。

0

我想嘗試的第一件事是確保異步處理在主線程上運行:

[service loadImage:url done:^(UIImage * image) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     CGContextDrawImage(context, frame, image.CGImage); 
    }); 
}]; 

如果這樣做沒有幫助,我就開始懷疑,如果上下文仍然有效。指針是,但上下文可能不是。也許你可以在上下文獲取移動到處理程序:

[service loadImage:url done:^(UIImage * image) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextDrawImage(context, frame, image.CGImage); 
     … 
    }); 
}]; 

不知道如果是有道理的API明智的,我沒有做很多這樣的東西。

+0

不行,恐怕。謝謝!其他海報是正確的,以後沒有有效的上下文可用。 – 2011-03-31 13:28:14

3

認爲它通過 - 爲什麼它運行?有沒有保證context仍然是進入語句塊時的當前上下文(甚至其後備存儲仍然是完全有效)。通過使用異步回調,無論是塊還是委託方法或其他方法,您都有意將代碼推遲到以後的某個時間點。撥打-drawRect:的電話已經結束,並且在您進入電話簿之前就已經關閉。

0

你試過:

__block CGContextRef context = UIGraphicsGetCurrentContext() 
[service loadImage:url done:^(UIImage * image){ 
    CGContextDrawImage(context, frame, image.CGImage); 
}]; 

您可能需要做同樣的事情與框架,所以當塊返回它知道什麼背景和框架應該修改。