2010-06-03 31 views
0

我正在執行CATiledLayerUIScrollView。在CATiledLayer,我有一個函數來繪製層像這樣:如何讓CATiledLayer不會阻塞主線程

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    CGContextTranslateCTM(ctx, 0.0f, 0.0f); 
    CGContextScaleCTM(ctx, 1.0f, -1.0f); 

    CGRect box = CGContextGetClipBoundingBox(ctx); 

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"urlhere"]]; 
    UIImage *image = [[UIImage alloc] initWithData:data]; 

    CGContextDrawImage(ctx, box, [image CGImage]); 
    [image release]; 
    [data release]; 
} 

的問題是,當每個圖塊下載它阻止其他瓷磚的下載。如果這些瓷磚是並行下載的,我會非常喜歡。特別是它阻止了我無法控制的另一個UI元素的下載。

基本上,我只需要知道如何在CATiledLayer圖形消息中異步下載數據。

回答

0

您可以像使用NSURLConnection那樣在任何其他情況下異步下載數據。下載完成後,告訴圖層重新繪製,然後調用-drawLayer:inContext:此時您只抓取下載的圖像。換句話說,不要使用-drawLayer下載數據,也不要使用默認情況下同步和阻止的-dataWithContentsOfURL。

+0

因此,數據下載並繪製到屏幕後,我應該釋放UIImage?如果我放棄並回來,它仍然會被吸引到那裏? – rickharrison 2010-06-04 13:35:45

+0

數據已被緩存,但無法控制緩存,因此您的代碼應該預期可以重複調用drawLayer:inContext – JakubKnejzlik 2014-05-21 16:21:28