0 votes

Comment faire en sorte que le CATiledLayer ne bloque pas le thread principal ?

Je suis en train de mettre en place un CATiledLayer en un UIScrollView . Dans le CATiledLayer J'ai une fonction pour dessiner les couches comme suit :

- (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 le téléchargement de chaque tuile bloque le téléchargement des autres tuiles. Je préférerais vraiment que ces tuiles soient téléchargées en parallèle. En particulier, cela bloque les téléchargements d'un autre élément de l'interface utilisateur que je ne contrôle pas.

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

0voto

Matt Long Points 16701

Vous téléchargez les données de manière asynchrone, comme vous le feriez dans n'importe quelle autre situation, en utilisant quelque chose comme NSURLConnection. Lorsque le téléchargement est terminé, demandez au calque de se redessiner, ce qui appellera alors -drawLayer:inContext : à ce moment-là, vous récupérez simplement 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X