2010-06-03 3 views
0

Je suis en train d'implémenter un CATiledLayer dans un UIScrollView. Dans le CATiledLayer, j'ai une fonction pour dessiner les couches comme ceci:Comment faire pour que CATiledLayer ne bloque pas le thread principal

- (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]; 
} 

Le problème est que lorsque chaque tuile télécharge il bloque les téléchargements d'autres tuiles. Je préférerais beaucoup que ces tuiles soient téléchargées en parallèle. En particulier, il bloque les téléchargements d'un autre élément de l'interface utilisateur que je ne contrôle pas.

Fondamentalement, j'ai juste besoin de savoir comment télécharger des données de manière asynchrone dans un message de dessin CATiledLayer.

Répondre

0

Vous téléchargez les données de manière asynchrone comme dans toute autre situation en utilisant quelque chose comme NSURLConnection. Lorsque le téléchargement est terminé, dites à la couche de retravailler ce qui appellera alors -drawLayer: inContext: à ce moment-là, vous venez de récupérer l'image qui a été téléchargée. En d'autres termes, ne téléchargez pas vos données dans -drawLayer et n'utilisez pas -dataWithContentsOfURL qui est synchrone et bloque par défaut.

+0

Donc, après que les données sont téléchargées et dessinées à l'écran, dois-je libérer l'UIImage? Si je pars et reviens, sera-t-il encore dessiné là? – rickharrison

+0

Les données sont mises en cache, mais vous ne pouvez pas contrôler la mise en cache. Votre code doit donc s'attendre à ce que drawLayer: inContext puisse être appelé à plusieurs reprises. – JakubKnejzlik

Questions connexes