2010-09-02 5 views
1

Je veux exécuter un seul fil d'arrière-plan pour une application iPhone qui est disponible en arrière-plan tout le temps et s'exécute lorsqu'un événement spécifique se déclenche et attend l'exécution d'un événement spécifique pour recommencer . Pendant l'exécution du thread si un événement spécifique est renvoyé, le thread devrait recommencer son travail.Objectif C - Fil d'arrière-plan simple

Je travaille sur une application de carte personnalisée. Sur l'événement TouchesMoved, je dois charger les mosaïques d'image de carte en fonction des positions déplacées dans un fil d'arrière-plan. Le problème est que lorsque je déplace la carte avec la vitesse de l'événement touchesMoved est déclenché le thread précédent n'a pas fini son travail et le nouveau thread est démarré. Il provoque un problème de sécurité de thread et mon application est plantée.

Donc je pense à une solution pour avoir un seul thread tout le temps disponible et commence son travail lorsque touchesMoved est déclenché si touchesMoved est renvoyé il devrait redémarrer son travail au lieu de démarrer un nouveau thread. Je pense que cela permettra d'éviter le problème de sécurité des threads.

S'il vous plaît aider

+0

Tout cela semble raisonnable, quel est le problème que vous rencontrez? –

+0

bienvenue à SO, s'il vous plaît modifier votre question au lieu d'ajouter une réponse. En outre, plus vous demandez à la probabilité plus élevée que vous obtenez la réponse que vous recherchez. –

+0

Anders K - Merci d'avoir signalé l'erreur. Question mise à jour – Anis

Répondre

6

Tout d'abord, je aurait écho l'utilisation de NSOperation et NSOperationQueue. Vous pouvez vous rabattre directement sur NSThread, mais le point NSOperation est qu'il vous cache le filetage, vous permettant de vous concentrer sur le traitement à effectuer. Essayez de lancer NSOperation requêtes au fur et à mesure des besoins, voir à quoi ressemble la performance dans votre cas d'utilisation; Même si ces opérations obtiennent des données de manière asynchrone, elles devraient vous fournir une solution plus propre avec de bonnes performances, plus une preuve d'avenir.

J'ai utilisé avec succès NSInvocationOperation pour déclencher des requêtes aussi souvent que nécessaire, et cela ressemble à la sorte d'exigences et de comportement que vous recherchez. Je suggère plus généralement que vous expérimenter avec ceux-ci dans un projet de test; Ici vous pouvez tester la performance.

Le son blog suivant m'a aidé à commencer à jouer avec NSOperation:

http://www.dribin.org/dave/blog/archives/2009/09/13/snowy_concurrent_operations/

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

Comme toujours, l'Apple Threading Programming Guide est une lecture clé, pour savoir quel chemin à parcourir en fonction des besoins.

+0

Problème résolu en utilisant NSOperation et NSOperationQueue. Merci – Anis

0

Mettre une boucle d'exécution dans votre fil de calcul d'arrière-plan. Utilisez ensuite une file d'attente NSOperation pour gérer l'envoi de messages. La file d'attente et la boucle d'exécution sérialiseront toutes les demandes de travail pour vous.

+2

Vous n'avez pas besoin de créer un thread d'arrière-plan si vous utilisez une NSOperationQueue. – JeremyP

3

Cela ressemble à un travail idéal pour un NSOperationQueue. Avoir une lecture de la section de la file d'attente d'opération du concurrency guide.

Essentiellement, vous créez un objet NSOperation pour chaque charge de tuiles de carte et de les placer sur une file d'attente qui ne allows them to execute one at a time.