iOS Comment déterminer ce qui est le blocage de l'INTERFACE utilisateur
Je suis assez nouveau dans le développement d'iOS, mais je commence à comprendre quelques-uns des concepts les plus complexes. J'ai actuellement une application qui implémente un AVCam pour capturer de la vidéo. Le AVCam est créé sur un thread séparé, mais utilise un affichage qui est en mon principal xib fichier. Lorsque la caméra se fait capturer, il appelle une fonction complète dans mon ViewController classe. Au sein de la fonction complète j'appelle un certain nombre d'autres fonctions que la mise à jour de l'INTERFACE utilisateur ainsi que quelques NSLogs. Tout semble bien fonctionner, je vois les logs dans la console immédiatement, mais l'INTERFACE utilisateur prend 3 secondes pour mettre à jour. J'ai essayé à l'aide d'instruments à trouver le code fautif, mais je n'arrive pas à le trouver. Est-il une autre façon de déterminer ce qui est le blocage de l'INTERFACE utilisateur?
Voici le code appelé lorsque l'enregistrement est terminé;
-(void)movieRecordingCompleted{
[HUD hide:YES];
NSLog(@"movieRecordingCompleted");
[self showModalViewController];
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mov"];
NSLog(@"pathToMovie: %@", pathToMovie);
pathToTreatedVid = pathToMovie;
NSLog(@"File Save Called");
UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, NULL, NULL);
}
Tout est connecté immédiatement, mais les progrès de la PALETTE et le modèle-vue-contrôleur ne se déclenche pas pendant 2 à 5 secondes, c'est très étrange.
Voici l'avant et l'après de l'état des fils (quand il est gelé vs quand il devient non gelée).
- Merci de montrer un peu de code où vous mettez à jour l'INTERFACE utilisateur.
Vous devez vous connecter pour publier un commentaire.
Essayer de mettre en Pause l'exécution du programme (il y a un bouton en bas de l'écran de
Xcode
, à la troisième)Navigator panel
),Debug Navigator
main
fonction, et mo, que vous pouvez découvrir par des méthodes dans ce fil, ce qui prend tant de temps pour mettre à jour votre INTERFACE utilisateur. La méthode de travail en ce moment est le top noir en général(avec la couleur grise répertoriésobj-c
méthodes internes).main
méthode au sein de l'. Vous devez régulièrement vérifier ce thread pour voir les méthodes qui sont exécutés dans la période de temps lorsque votre application est gelé. Les autres threads est considéré comme threads d'arrière-plan et n'affectent pas sur l'INTERFACE utilisateur de mise à jour(en fait, ils peuvent faire appel à l'INTERFACE utilisateur fonctions de mise à jour, mais l'IU de l'actualisation dans le Thread Principal de toute façon)UISaveVideoAtPathToSavedPhotosAlbum()
fonction exécute de façon asynchrone, donc ça prend du temps avant qu'il ne soit terminé.Vous pouvez utiliser le Système de l'outil de traçage dans les Instruments par l'exécution de votre Application en mode de profil. Ensuite, vous obtenez une course vers le bas tous les threads dans le système ainsi que les traces de pile à chaque planification de l'événement le fil passe à travers.
Il y a une grande vidéo de la à 2016 de la WWDC Système de Trace dans la Profondeur qui vous guidera lors du débogage d'un thread bloqué problème.
C'est beaucoup mieux que le Temps Profiler instrument depuis, cet outil fonctionne basé sur le prélèvement d'échantillons de ce qui est en cours d'exécution sur le PROCESSEUR à des intervalles. Toutefois, si votre fil est bloqué, il n'est pas en cours d'exécution sur le PROCESSEUR, donc -, il ne sera pas échantillonnées. Vous pourriez avoir votre thread principal bloqué pendant une seconde entière, mais il n'apparaît pas dans le Temps Profiler.
Vous pouvez utiliser Temps Profiler pour trouver ce que le blocage de votre application.
J'aime utiliser cette fonction:
où "x" est le nombre de secondes...il sera tout simplement bloquer tout ce que c'est le fil de l'exécuter sur pour le nombre de secondes. Si votre INTERFACE utilisateur se bloque, vous savez que vous avez bloqué le thread principal et donc que le code est exécuté dans le thread principal (que vous le vouliez ou pas). Essayez de placer cet appel à différents endroits dans votre code et il devrait vous aider à diagnostiquer ce qui se passe. Espérons que cela aide.