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?
Ce code (PSPDFUIKitMainThreadGuard provoque des assertions sur l'accès UIKit en dehors du thread principal
Étapes à suivre:
PSPDFAssert
vers le premier du fichierPSPDFLogError
car il n'est pas défini<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
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.