2010-06-03 3 views
0

Я реализую CATiledLayer в UIScrollView. В 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]; 
} 

Проблема заключается в том, что, когда каждая плитка загружает его блокирует загрузку других плиток. Я бы очень хотел, чтобы эти плитки были загружены параллельно. В частности, он блокирует загрузку другого элемента интерфейса, который я не контролирую.

В принципе, мне просто нужно знать, как загружать данные асинхронно в сообщении чертежа CATiledLayer.

ответ

0

Вы загружаете данные асинхронно, как в любой другой ситуации, используя что-то вроде NSURLConnection. Когда загрузка завершена, скажите слою повторно рисовать, который затем вызовет -drawLayer: inContext: в этот момент вы просто захватываете загруженное изображение. Другими словами, не загружайте данные в -drawLayer и не используйте -dataWithContentsOfURL, который является синхронным и блокирует по умолчанию.

+0

Итак, после того, как данные будут загружены и нарисованы на экране, я должен освободить UIImage? Если я отворачиваюсь и вернусь, он все равно будет там нарисован? – rickharrison

+0

Данные кэшируются, но вы не можете контролировать кеширование, поэтому ваш код должен ожидать, что drawLayer: inContext может быть вызван повторно – JakubKnejzlik

Смежные вопросы