Reposicionar con una pregunta más concisa y enfocada después de que la pregunta original no fue respondida. También agregando más información sobre el problema después de otro día de investigación:Mostrar una vista es muy lento en CTCallCenter callEventHandler
En mi delegado de la aplicación (didFinishLaunching), configuré un callEventHandler en CTCallCenter. La idea es que cuando un callState cambia, publico una notificación con un userInfo dict que contiene el call.callState. En mi opinión, observo esta notificación, y cuando el dictus de información de usuario contiene un valor de CTCallDisconnected, quiero mostrar una vista.
El problema que estoy teniendo es que el aspecto de desenrrollamiento está tomando, casi constantemente, ~ 7 segundos. Todo lo demás está funcionando bien, y sé esto porque NSLog antes y después del desencriptado, y esos registros aparecen inmediatamente, pero la vista zurcida sigue retrasada durante 7 segundos.
Aquí está mi código:
appDidFinishLaunching:
self.callCenter = [[CTCallCenter alloc] init]; self.callCenter.callEventHandler = ^(CTCall* call) { // anounce that we've had a state change in our call center NSDictionary *dict = [NSDictionary dictionaryWithObject:call.callState forKey:@"callState"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"CTCallStateDidChange" object:self userInfo:dict]; };
entonces escucho para esta notificación cuando un usuario pulsa un botón que marca un número de teléfono:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctCallStateDidChange:) name:@"CTCallStateDidChange" object:nil];
Luego, en ctCallStateDidChange :
- (void)ctCallStateDidChange:(NSNotification *)notification { NSLog(@"121"); NSString *callInfo = [[notification userInfo] objectForKey:@"callState"]; if ([callInfo isEqualToString:CTCallStateDisconnected]) { NSLog(@"before show"); [self.view viewWithTag:kNONEMERGENCYCALLSAVEDTOLOG_TAG].hidden = NO; NSLog(@"after show"); } }
He rastreado el problema a la condición if en el ejemplo de código anterior:
if ([[userInfo valueForKey:@"userInfo"] valueForKey:@"callState"] == CTCallStateDisconnected) {
Si sólo tiene que sustituir eso con:
if (1 == 1) {
Entonces la vista aparece inmediatamente!
Lo que pasa es que esas declaraciones NSLog se están registrando inmediatamente, pero la vista es quedando rezagada. ¿Cómo podría esa condición causar que solo una parte de su bloque se ejecute inmediatamente, y el resto espere ~ 7 segundos?
Gracias!
Proceso de ocultar/revelar la vista es muy rápido. El problema es con el contenido de su vista y su super visión. ¿Has intentado perfilar el caso con instrumentos? Código postal donde configura la vista que se ocultará y verá que se revelará después de ocultarse. – Zapko
Gracias. Acabo de actualizar mi publicación original. La imagen en la vista es de 4 KB, así que no creo que sea un problema. Solo traté de dejar la imagen, y todavía tengo el retraso. No muy familiarizado con los instrumentos. Solo he mirado realmente las pérdidas de memoria a través de esa herramienta, por lo que no estoy muy seguro de cómo inspeccionaría lo que sucede aquí detrás de escena. – djibouti33
Utilice el perfil de tiempo, le mostrará la pila de llamadas en todo momento y el tiempo que funcionó cada función. Seguramente lo ayudará – Zapko