2010-06-18 8 views
4

Je sais que drawLayer: et drawlayer:inContext: sont appelés sur plusieurs threads lors de l'utilisation d'un CATiledlayer, mais qu'en est-il drawRect:?drawRect: appelé sur plusieurs threads lors de l'utilisation d'un CATiledlayer?

Le code d'exemple Apple PhotoScroller utilise drawRect: pour obtenir ses images à partir du disque, et il n'a pas de code spécial pour gérer les threads.

J'essaye de déterminer si mon modèle pour un CATiledLayer doit être thread-safe.

Répondre

1

Avez-vous vu cela technical Q&A from Apple?

Il ne répond pas directement à votre question, mais il pourrait vous aider à décider comment implémenter votre modèle.

+0

Cet article contient une contradiction, mais il dit à peu près que vous devez être enfilé. Regarder la vidéo de la session de la WWDC me donne une pièce supplémentaire du puzzle qui me convainc que c'est le cas. –

2

Oui, drawRect peut et sera appelé sur plusieurs threads (testé sous OS 4.2).

Ce comportement est moins évident si votre dessin est suffisamment rapide pour surpasser l'arrivée de nouveaux mouvements de zoom afin que votre application puisse fonctionner correctement jusqu'à ce qu'elle soit testée avec une saisie rapide des gestes de zoom.

Une alternative est de rendre votre modèle thread-safe. Si la sécurité du thread est obtenue en synchronisant la plupart des accès au modèle de données à un thread de dessin à la fois, alors vous pouvez faire aussi bien de mutex le corps de drawRect avec quelque chose comme @syncrhonize (self) qui semble fonctionner.

Je n'ai pas trouvé un moyen de demander que CATiledLayer utilise uniquement un thread d'arrière-plan.

+0

Vous pouvez également envisager de ne pas affecter directement le modèle à un objet de vue (votre calque). Mais à la place, votre contrôleur gère les modifications du modèle et n'attribue que des objets non-threads immuables à la couche. Si le modèle change, vous pouvez toujours mettre à jour la couche et appeler setNeedsDisplay. – Alej

2

J'ai trouvé CATiledLayer utilise plusieurs threads de fond dans le simulateur iOS, mais un seul thread d'arrière-plan sur mon iPhone.

Mon Mac a un processeur double cœur, alors que mon iPhone a un seul noyau (A4).

Je suppose qu'un appareil iOS avec une CPU A5 utilisera également plusieurs threads.