web-dev-qa-db-fra.com

iOS9 - Cette application modifie le moteur de récupération automatique à partir d'un thread en arrière-plan - où?

Pour la recherche, le message d'erreur est le suivant:

Cette application modifie le moteur d'autolayout à partir d'un thread en arrière-plan, ce qui peut entraîner une corruption du moteur et des plantages bizarres. Cela provoquera une exception dans une version ultérieure.

Je sais que cela signifie que du code UIKit est appelé à partir d'un thread en arrière-plan, et je sais que la solution consiste à envelopper le code dans

dispatch_async(dispatch_get_main_queue(), ^(void){ <code> });

Mon problème est de savoir où faire cela, aucune trace de la pile imprimée ne faisant référence à mon code d'application. Mon preuve pour prouver ce négatif est la recherche (commande-f) dans la fenêtre de sortie du débogage pour le nom de mon application; J'ai 24 sorties de pile vidées et mon nom d'application ne figure dans aucune d'entre elles, sauf en haut du message d'erreur. Je peux en poster un, mais cela ne semble pas très utile.

Dans les cas sur lesquels je travaille aujourd'hui, cela se produit lors de la transition des contrôleurs de vue, après viewWillDisappear() et avant viewWillAppear(). J'ai trouvé des parties de mon code pour envelopper dispatch_async(), mais elles sont toutes gérées maintenant. J'ai des points d'arrêt et des messages de débogage où les objets pertinents pour les contrôleurs de vue sont alloués et désalloués, et ils se déclenchent tous après l'affichage des messages d'exception. Cela se produit à la fois sur le simulateur et sur mon iPhone iOS9, dans les modes de débogage et de libération.

Comment puis-je identifier le code d'arrière-plan qui modifie apparemment l'interface utilisateur?

37
robm

Ce code (PSPDFUIKitMainThreadGuard provoque des assertions sur l'accès UIKit en dehors du thread principal

Étapes à suivre:

  1. Ajouter au projet et compiler ce fichier sans ARC
  2. Déplacez la définition PSPDFAssert vers le premier du fichier
  3. Comment appeler de PSPDFLogError car il n'est pas défini
  4. importer <UIKit/UIKit.h>

Votre application va planter et s'arrêtera avec toute tentative de modification d'un élément d'interface utilisateur à partir du fil de fond

Pour Swift, utilisez le code suivant: NBUIKitMainThreadGuard

55
Mahmoud Adam

Modifiez le schéma de votre projet et sous l'action Exécuter , dans le diagnostic . onglet, sous Vérification de l'API d'exécution , assurez-vous que Pause dans les problèmes est cochée . Lorsque des mises à jour de l'interface utilisateur en arrière-plan se produisent, l'application se met en pause.

enter image description here

1
Ashley Mills