how to display UIActivityIndicatorView ANTES de que comience la rotación

Me gustaría mostrar un indicador de actividad ANTES del trabajo realizado porwillAnimateRotationToInterfaceOrientation: duración: comienza. La mayoría de las veces en mi aplicación, este trabajo se completa rápidamente y no habría necesidad de un indicador de actividad, pero ocasionalmente (primera rotación, es decir, antes de haber almacenado datos en caché, cuando trabajo con un archivo grande) puede haber un retraso notable . En lugar de rediseñar mi aplicación para hacer frente a este caso poco común, prefiero mostrar el UIActivityIndicatorView mientras la aplicación genera un caché y actualiza la pantalla.

El problema es (o parece ser) que la pantalla no se actualiza entrewillRotateToInterfaceOrientation: duración y willAnimateRotationToInterfaceOrientation: duración: método. Entonces, pedirle a iOS que muestre UIActivityIndicatora vista @ en el método willRotate en realidad no afecta la visualización hasta después de la willAnimateRotation método.

El siguiente código ilustra el problema. Cuando se ejecuta, el indicador de actividad aparece solo muy brevemente y DESPUÉS de la simulateHardWorkNeededToGetDisplayInShapeBeforeRotationl método @ se ha completado.

¿Me estoy perdiendo algo obvio? Y si no, ¿alguna idea inteligente sobre cómo podría solucionar este problema?

Actualiza: Si bien las sugerencias sobre cómo cultivar el trabajo pesado en otro hilo, etc., generalmente son útiles, en mi caso particular, tipo dedo quiere bloquear el hilo principal para hacer mi levantamiento. En la aplicación, tengo una tabla Ver todas las alturas cuyas alturas necesitan ser recalculadas. Cuando, lo cual no es un caso de uso muy común o ni siquiera estaría considerando este enfoque, hay muchas filas, todas las nuevas alturas se calculan (y luego se almacenan en caché) durante un [tableView reloadData]. Si recojo el levantamiento y dejo que continúe la rotación, luego de la rotación y antes del levantamiento, mi tableView no se ha vuelto a cargar. En el caso de retrato a paisaje, por ejemplo, no ocupa todo el ancho. Por supuesto, hay otras soluciones alternativas, p. construyendo un tableView con solo unas pocas filas antes de la rotación y luego recargando el real sobre eso, etc.

Código de ejemplo para ilustrar el problema:

@implementation ActivityIndicatorViewController

@synthesize activityIndicatorView = _pgActivityIndicatorView;
@synthesize label = _pgLabel;

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}


- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
{
    NSLog(@"willRotate");

    [self showActivityIndicatorView];
}


- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
{
    NSLog(@"willAnimateRotation");
    [self simulateHardWorkNeededToGetDisplayInShapeBeforeRotation];
}


- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
{
    NSLog(@"didRotate");
    [self hideActivityIndicatorView];
}


- (void) simulateHardWorkNeededToGetDisplayInShapeBeforeRotation;
{
    NSLog(@"Starting simulated work");
    NSDate* date = [NSDate date];

    while (fabs([date timeIntervalSinceNow]) < 2.0)
    {
        //
    }
    NSLog(@"Finished simulated work");
}


- (void) showActivityIndicatorView;
{
    NSLog(@"showActivity");
    if (![self activityIndicatorView])
    {
        UIActivityIndicatorView* activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        [self setActivityIndicatorView:activityIndicatorView];
        [[self activityIndicatorView] setCenter:[[self view] center]];
        [[self activityIndicatorView] startAnimating];
        [[self view] addSubview: [self activityIndicatorView]];
    }

    // in shipping code, an animation with delay would be used to ensure no indicator would show in the good cases
    [[self activityIndicatorView] setHidden:NO];
}

- (void) hideActivityIndicatorView;
{
    NSLog(@"hideActivity");
    [[self activityIndicatorView] setHidden:YES];
}


- (void) dealloc;
{
    [_pgActivityIndicatorView release];
    [super dealloc];
}


- (void) viewDidLoad;
{
    UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(50.0, 50.0, 0.0, 0.0)];
    [label setText:@"Activity Indicator and Rotate"];
    [label setTextAlignment: UITextAlignmentCenter];
    [label sizeToFit];
    [[self view] addSubview:label];
    [self setLabel:label];
    [label release];
}

@end

Respuestas a la pregunta(4)

Su respuesta a la pregunta