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
.
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
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