Question

Est-il possible lors de l'envoi de ce message à préciser que je préfère avoir mon sélecteur effectué après tous les événements de l'interface utilisateur en attente, le cas échéant? C'est à dire. donner mon aterDelay timer une priorité inférieure dans la file d'attente.

Était-ce utile?

La solution

Pas directement. Si vous utilisez le sélecteur est performSelector:withObject:afterDelay: effectuée sur le fil principal , donc par définition, il se produira après que tous les actuels « en cours » des événements de l'interface utilisateur ont été réalisées, mais cela pourrait être au milieu d'un rouleau ou de l'animation, que vous auriez probablement envisager d'être un événement continu, mais est en fait des centaines de ceux séparés.

Cependant, vous pouvez obtenir quelque chose de similaire en utilisant performSelectorInBackground:withObject:, puis en appelant la méthode dans [NSThread setThreadPriority:0.01] appelée. Faites attention, vous êtes l'ouverture d'un fil d'arrière-plan, de sorte que vous ne pouvez pas faire des appels de l'interface utilisateur. Cependant, cela vous permettra de faire le travail sur un fil de fond avec une priorité inférieure à la principale thread d'interface utilisateur. (Rappelez-vous de mettre en place une piscine autorelease car il est dans son propre thread!)

Autres conseils

En fait, ne pas performSelector:withObject:afterDelay: nécessairement se produire sur le thread principal; Voilà pourquoi il y a une méthode distincte performSelectorOnMainThread:withObject:waitUntilDone:. La documentation dit +[NSThread detachNewThreadSelector:toTarget:withObject:]

  

invoque une méthode du récepteur sur le fil de courant en utilisant le mode par défaut après un délai.

Si vous souhaitez effectuer une tâche en arrière-plan, vous pouvez regarder dans <=>, qui va lancer un nouveau thread pour effectuer votre tâche, et laisser l'interface utilisateur réactive. L'utilisation d'un thread séparé pour exécuter une tâche de longue haleine qui pourrait autrement verrouiller votre interface utilisateur est généralement une bonne idée, mais il n'ajoute la complexité. Si vous n'êtes pas familier avec le filetage, vous pouvez vous retrouver avec des bugs qui ne fera pas de sens.

Dans un commentaire ci-dessus, vous avez mentionné que vous pensez animation peut être en faute pour rendre votre interface utilisateur ne répond pas. Si vous utilisez le support intégré pour l'animation (Core Animation ou l'un des emballages de cacao), l'animation ne devrait pas rendre votre interface utilisateur ne répond pas. Une interface utilisateur ne répond signifie généralement que votre programme est en train de faire beaucoup de travail sur le thread principal avant de laisser la boucle d'exécution revenir aux événements de l'interface utilisateur de service.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top