UIActionSheet tardando mucho time en responder

Estoy creando un UIActionSheet en actionSheet: clickedButtonAtIndex delegate method.

 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex if(buttonIndex == 1){ [self.myFirstView removeFromSuperview]; if (!self.mySecondView) { [[NSBundle mainBundle] loadNibNamed:@"MySecondView" owner:self options:nil]; } [self.mySecondView setFrame:CGRectMake(0, 0, 320, 480)]; [[UIApplication shanetworkingApplication].keyWindow addSubview: self.mySecondView]; UIActionSheet * action = [[UIActionSheet alloc]initWithTitle:@"" delegate:self cancelButtonTitle: nil destructiveButtonTitle: deleteContacts otherButtonTitles: cancel, nil]; action.tag = 102; [action showInView:self.view]; [action release]; } 

UIActionSheet evento de clic de este UIActionSheet con el mismo método que el anterior.

 if(actionSheet.tag == 102){ if(buttonIndex == 0){ if([[NSBundle mainBundle] loadNibNamed:@"MyThirdView" owner:self options:nil]) { [self.myThirdView setFrame:CGRectMake(0, 0, 320, 480)]; [[UIApplication shanetworkingApplication].keyWindow addSubview:self.myThirdView]; } [self.mySecondView removeFromSuperview]; [self.doneButton.target performSelector:self.doneButton.action withObject:self.doneButton.target]; [self performSelector:@selector(RemoveView) withObject:self afterDelay:3.0]; } } 

El problema que estoy enfrentando es que, la UIActionSheet toma demasiado time para responder. Cuando hago clic en el button UIActionSheet , está en estado congelado durante 2 o 3 segundos, antes de cargar myThirdView . No puedo entender, cuál es la demora de la respuesta en este caso, ya que lo primero que hago en el button de clic en UIActionSheet hacer clic en el método de evento para cargar myThirdView . El rest del código se ejecuta solo después del código para cargar myThirdView. Pero incluso la primera línea de código parece ejecutarse después de un retraso. ¿Alguna sugerencia?

Pregunta. ¿El UIActionSheet se congela o desaparece y la tercera vista no se ve durante 2-3 segundos?

Esto podría deberse a 1 de 2 problemas.

  1. Si toda la hoja de acción se congela, entonces está haciendo un trabajo pesado al iniciar esa tercera vista, está cargando algunos datos básicos, o muchos activos, o algo que lleva mucho time. Si este es el caso, necesitará reformatear CÓMO carga esa tercera vista. Sugiero empujar cualquier carga pesada al background (esto significa que si tiene muchas imágenes en su xib, es posible que necesite cargarlas en el código).

  2. La otra posibilidad es que esté agregando la tercera vista ABAJO de la segunda vista, y luego no ocultando la segunda vista durante 3 segundos (hecho realizando el selector con un retraso). Si este es el caso, simplemente elimine la demora.

Hice un par de classs para ayudarme a cronometrar las ejecuciones y encontrar los cuellos de botella en mi código, parece que podrían ayudarte ahora. http://forrst.com/posts/Code_Execution_Timer_for_iOS_Development-dSJ

esto es quizás debido a esto

 [self performSelector:@selector(RemoveView) withObject:self afterDelay:3.0]; 

Haga otros methods y haga esto en ese método. Me gusta esto

 [self viewRemover]; 

y en viewRemover

 -(void) viewRemover { [self performSelector:@selector(RemoveView) withObject:self afterDelay:3.0]; } 

tu código será así ahora

 if(actionSheet.tag == 102){ if(buttonIndex == 0){ if([[NSBundle mainBundle] loadNibNamed:@"MyThirdView" owner:self options:nil]) { [self.myThirdView setFrame:CGRectMake(0, 0, 320, 480)]; [[UIApplication shanetworkingApplication].keyWindow addSubview:self.myThirdView]; } [self.mySecondView removeFromSuperview]; [self.doneButton.target performSelector:self.doneButton.action withObject:self.doneButton.target]; [self performSelectorInBackground:@selector(viewRemover) withObject:nil]; } } 

Las acciones de la interfaz de usuario se ejecutan en el hilo principal y solo ocurren cuando termina su método. Entonces, MyThirdView no aparecerá hasta que las otras instrucciones hayan finalizado. Lo único que puedo deducir es que es:

 [self.doneButton.target performSelector:self.doneButton.action withObject:self.doneButton.target]; 

Si está haciendo algún cálculo pesado o connection a la networking, seguro que ese es el motivo.

OTOH, creo que será mejor que modifique esa línea:

 [self.doneButton.target performSelector:self.doneButton.action withObject:self.doneButton]; 

Si quieres simular un button, toca la acción.

Qué tan grande es tu tercera vista. si el file nib necesita cargar demasiado, puede estar esperando que ocurra un montón, también si tiene que cambiar algunos elementos de la interfaz de usuario y bloquear el subprocess de la interfaz de usuario, boostá su aplicación hasta que se produzca un time de espera y la aplicación cambiará algunas cosas para compensar …

la ruta que tomo con esto es dispatch_async y dispatch_sync

 // This will release the UI thread which may be blocking your calls. // You can use any of the DISPATCH_QUEUE_PRIORITY_.... values to set how important this block is. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // this command will get added to the stack and return without a hitch. // the block will be run the next time the main runloop ends. dispatch_async(dispatch_get_main_queue(), ^{ // do some UI work that can happen without a hitch, and does not impact the calling block }); // this command will act much the same. but will pause the background execution // of this block until the runloop has executed this and returned. dispatch_sync(dispatch_get_main_queue(), ^{ // do some UI work that must be completed to continue. }); }); 

hacer demasiado en el subprocess de interfaz de usuario hará una pausa en la ejecución de las cosas que se astackn en la queue. Enviar todo el código al subprocess de background y solo saltear al subprocess de la interfaz de usuario cuando necesite modificar la interfaz de usuario es una manera mejor y más receptiva de codificar su aplicación de iPhone.

Espero que esto ayude 🙂