Как сделать так, чтобы CATiledLayer не блокировал основной поток - PullRequest
0 голосов
/ 03 июня 2010

Я внедряю CATiledLayer в UIScrollView. В 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 чертежном сообщении.

1 Ответ

0 голосов
/ 04 июня 2010

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

...