2010-03-03 8 views
3

J'ai une classe qui travail est d'analyser un texte en plusieurs pages. J'utilise sizeWithFont: méthode pour identifier quand une page se termine et une autre commence. Malheureusement, étant donné que la quantité de texte à analyser est assez importante, toute l'opération doit être effectuée sur un thread d'arrière-plan (cela prend plusieurs secondes). Et donc parfois je reçois des artefacts visuels sur mon interface (UIKit n'est pas thread-safe mais je l'appelle de plusieurs threads simultanément), dont j'aimerais me débarrasser.Alternative pour sizeWithFont: méthode

Je dois me débarrasser de l'utilisation de sizeWithFont: sur le thread d'arrière-plan. Mais il ne semble pas y avoir d'alternative pour cette méthode. La seule façon de connaître la largeur du texte avec Core Graphics est d'utiliser la méthode indiquée dans la documentation de la pomme:

  1. Appelez la fonction CGContextGetTextPosition pour obtenir la position de texte actuel.
  2. Définissez le mode de dessin de texte sur kCGTextInvisible à l'aide de la fonction CGContextSetTextDrawingMode.
  3. Dessinez le texte en appelant la fonction CGContextShowText pour dessiner le texte à la position de texte actuelle.
  4. Déterminez la position de texte finale en appelant la fonction CGContextGetTextPosition.
  5. Soustrayez la position de départ de la position finale pour déterminer la largeur du texte.

Mais je suis vraiment inquiet que cela conduise à une énorme perte de performance.

Quelqu'un connaît un autre moyen de connaître la largeur du texte?

Répondre

1

Si vous avez la possibilité de cibler votre application pour iPhone OS 3.2, vous pouvez jeter un oeil à Core Text. Bien que, notez que toute la bibliothèque de texte principal n'est pas complètement thread-safe non plus. De la documentation:

Considérations multicœur: Toutes les fonctions individuelles dans le texte principal sont thread-safe. Les objets de police (CTFont, CTFontDescriptor et les objets associés) peuvent être utilisés simultanément par plusieurs opérations, files d'attente de travail ou threads. Cependant, les objets de mise en page (CTTypesetter, CTFramesetter, CTRun, CTLine, CTFrame et les objets associés) doivent être utilisés dans une seule opération, une file d'attente de travail ou un thread.