L'affichage d'une vue est très lent dans CTCallCenter callEventHandler

Repositionnement avec une question plus concise et ciblée après la question initiale est restée sans réponse. En ajoutant également plus de perspicacité dans le problème après une autre journée de search:

Dans mon délégué d'application (didFinishLaunching), j'ai mis en place un callEventHandler sur CTCallCenter. L'idée est que quand un callState change, je post une notification avec un userInfo dict contenant le call.callState. À mon avis, j'observe cette notification, et quand le userInfo dict contient une valeur de CTCallDisconnected, je veux afficher une vue.

Le problème que j'ai, c'est que l'aspect caché prend, presque toujours, ~ 7 secondes. Tout le rest fonctionne bien, et je le sais parce que je NSLog avant et après l'affichage, et ces journaux apparaissent immédiatement, mais la vue reprogrammée est encore en retard pendant 7 secondes.

Voici mon code:

appDidFinishLaunching:

     self.callCenter = [[CTCallCenter alloc] init];
     self.callCenter.callEventHandler = ^ (appel CTCall *) {
         // anounce que nous avons eu un changement d'état dans notre centre d'appels
         NSDictionary * dict = [NSDictionary dictionaryWithObject: call.callState forKey: @ "callState"];
         [[NSNotificationCenter defaultCenter] postNotificationName: @ Objet "CTCallStateDidChange": self userInfo: dict];
     }

J'écoute ensuite cette notification lorsqu'un user appuie sur un button qui compose un numéro de téléphone:

     [[NSNotificationCenter defaultCenter] addObserver: auto-sélecteur: @selector (ctCallStateDidChange :) nom: @ "CTCallStateDidChange" object: nil];

Ensuite, dans ctCallStateDidChange:

 - (void) ctCallStateDidChange: notification (NSNotification *)
 {
    NSLog (@ "121");
    NSSsortingng * callInfo = [[notification userInfo] objectForKey: @ "callState"];
    if ([callInfo isEqualToSsortingng: CTCallStateDisconnected]) {
       NSLog (@ "avant le spectacle");
       [self.view viewWithTag: kNONEMERGENCYCALLSAVEDTOLOG_TAG] .hidden = NO;
       NSLog (@ "après le spectacle");
    }
 }

J'ai suivi le problème jusqu'à la condition if dans l'exemple de code ci-dessus:

    if ([[userInfo valueForKey: @ "userInfo"] valueForKey: @ "callState"] == CTCallStateDisconnected) {

Si je remplace simplement cela par:

 if (1 == 1) {

Ensuite, la vue apparaît immédiatement!

Le fait est que ces instructions NSLog se connectent immédiatement, mais la vue est à la traîne. Comment cette condition peut-elle provoquer l'exécution immédiate d'une partie de son bloc, et le rest attendre environ 7 secondes?

Merci!

Essayez de changer votre code pour ceci:

- (void)ctCallStateDidChange:(NSNotification *)notification { NSLog(@"121"); NSSsortingng *callInfo = [[notification userInfo] objectForKey:@"callState"]; if ([callInfo isEqualToSsortingng:CTCallStateDisconnected]) { NSLog(@"before show"); [self.view viewWithTag:kNONEMERGENCYCALLSAVEDTOLOG_TAG].hidden = NO; NSLog(@"after show"); } } 

Remarque:

  • Le paramètre est un NSNotification , pas un NSDictionary
  • Je ne comparerais pas les strings avec ==
  • Pas besoin de jeter la vue pour changer la propriété hidden
  • Utilisez NO au lieu de false

Mise à jour : Vous avez une idée: Pourriez-vous essayer ce qui suit, s'il vous plaît, entre les NSLog ?

 dispatch_async(dispatch_get_main_queue(), ^{ [self.view viewWithTag:kNONEMERGENCYCALLSAVEDTOLOG_TAG].hidden = NO; }); 

En lisant le document CTCallCenter , il semble que le callEventHandler soit dissortingbué sur "la queue de répartition globale prioritaire par défaut", qui n'est pas la queue principale où toutes les choses se passent.

On dirait qu'il n'y a pas de problème avec votre code caché. Si j'étais vous, je commenterais tout le code après la fin de l'appel, et décommenterais un par un pour voir quel est le problème.

Hm … essayez d'appeler [yourViewController.view setNeedsDisplay] après avoir changé la propriété cachée. Ou évitez les methods masquées, utilisez alpha ou addSubview: et removeFromSuperview à la place.

djibouti33,

Où vous mettez cette phrase à écouter quand un user appuie sur un button qui compose un numéro de téléphone? Sur la fonction WillResignActive?

cette phrase -> [[NSNotificationCenter defaultCenter] addObserver: auto-sélecteur: @selector (ctCallStateDidChange 🙂 nom: @ "CTCallStateDidChange" object: nil];

Merci pour votre time,

Willy.