Dans votre cas, cela dépend vraiment de ce qui se passe dans [app ChangeView], mais la raison pour laquelle il cesse de répondre est plus probable que vous n'avez pas l'envoi d'événements boucle d'exécution sur votre nouveau thread secondaire (voir plus bas). En général, cependant, il est une très mauvaise idée de mettre à jour l'interface utilisateur graphique d'un thread secondaire. Comme vous l'avez déjà découvert, tous ces événements devraient passer par le fil conducteur.
La principale raison pour laquelle votre deuxième exemple fonctionne et non votre première est que UIApplication met en place et gère la boucle d'exécution et répartiteur d'événements pour vous sur le thread principal. Donc, lorsque vous appelez performSelectorInMainThread, le sélecteur se dépêcha à la boucle principale d'exécution qui est capable de gérer ensuite l'entrée de votre interface utilisateur graphique et d'autres événements. Le répartiteur d'événements est également dirigé et géré par UIApplication sur le thread principal.
Donc , fondamentalement, ne pas effectuer toutes les activités de gestion de l' interface graphique sur un fil secondaire. Expédition ceux du thread principal. Et si vous avez besoin de traitement sur un fil secondaire (pour des choses comme des minuteries ou des appels ASYNCH, etc.), vous devez démarrer et gérer votre propre boucle d'exécution sur ce thread (voir NSRunLoop pour en savoir plus sur la gestion de votre sur boucle d'exécution).