2010-09-08 15 views
6

J'ai NSOperationQueue avec quelques NSOperations dedans (NSInvocationOperations, en particulier). Ces opérations effectuent des calculs et modifient les états des éléments de l'interface utilisateur en conséquence (bien sûr, via performSelectorOnMainThread:...), souvent en utilisant des animations.Pause NSOperation

Mon interface utilisateur a UINavigationViewController et quelques boutons pour la navigation vers d'autres vues. L'utilisateur peut donc quitter la vue en cours, alors que les calculs/animations sont toujours en cours. Et ce dont j'ai besoin, c'est d'arrêter ça jusqu'à ce que l'utilisateur revienne à la vue actuelle.

La seule solution que j'ai trouvée est de créer un drapeau booléen thread-safe - et de le vérifier dans tous les threads (quelque chose comme: while! Flag sleep_for_some_time;). Y at-il quelque chose de mieux?

Répondre

12

La question est un peu vague, donc c'est difficile à dire sans connaître tout le code en jeu. Cela dit, je peux aborder le problème par:

Option 1. Dans votre sous-classe de NSOperation, ajoutez votre propre propriété atomique KVO "isPaused". Dans l'opération elle-même, observez cette propriété et gérez-la en conséquence si elle change.

Option 2. Avez-vous déjà suspendu la file d'attente d'opérations elle-même? Si c'est le cas, envisagez d'observer cette propriété à l'intérieur de vos opérations, et chacune d'elles peut agir indépendamment si cette valeur change.

Option 3. Annulez toutes les opérations dans la file d'attente et, si la vue réapparaît, redémarrez simplement avec de nouvelles opérations. Dans l'ensemble, cependant, il n'y a pas de solution miracle pour interrompre les opérations déjà en cours. Vous devrez faire votre propre solution. Les dégâts ne devraient pas être trop mauvais cependant.