Tengo lo que creo que es un UX operación sucediendo en un subproceso en segundo plano. En un método que utiliza bloques, en el éxito estoy llamando a:

[self.navigationController popViewControllerAnimated:TRUE]; 

Estoy recibiendo un accidente, así que estoy pensando que la comprobación del subproceso actual y llamar a performSelectorOnMainThread podría solucionar este problema, pero no estoy seguro de cómo configurar el @selector parte de la llamada.

[self performSelectorOnMainThread:@selector([self.navigationController popViewControllerAnimated:TRUE]) withObject:nil waitUntilDone:NO];

no está funcionando. ¿Cuál es la sintaxis correcta?

Sólo un punto menor, pero objective-c BOOL valores son YES,NO, no TRUE,FALSE.

OriginalEl autor Rob Bonner | 2013-12-28

2 Comentarios

  1. 56

    Para forzar el método para realizar en el hilo principal se puede utilizar:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.navigationController popViewControllerAnimated:TRUE]; 
    });
    El código es correcto, pero el estilo-sabia yo prefiero el de más alto nivel: [[NSOperationQueue mainQueue] addOperationWithBlock:^{[auto.navigationController popViewControllerAnimated:TRUE];}];
    Eh, es un cara o cruz para mí… [[NSOperationQueue mainQueue] addOperationWithBlock es más versátil ya que soporta más funciones como el stop/start, dependencias, etc. Pero el bajo nivel de idioma dispatch_async(dispatch_get_main_queue() (es decir, MCD) es un poco más rápido. Supongo que depende de lo que necesites… Pero ya popViewControllerAnimated: en este caso es una operación rápida, tal vez no necesita todas las campanas y silbidos de nivel superior [[NSOperationQueue mainQueue] addOperationWithBlock…
    Para mí no se trata de las características adicionales, es sobre lo que es más legible. Y la velocidad de sólo importa si usted probar tu código y saber que es lento. Me parece Objective-C, mucho más legible que la recta C, y el ‘mainQueue’ en el Objetivo-C interfaz de saltos mucho más que la dispatch_get_main_queue (a) en C. Si usted cree en Objective-C, que usted permanezca en Objective-C cuando se puede.

    OriginalEl autor Lyndsey Scott

  2. 6

    Estrictamente hablando, no se puede hacer directamente lo que desea a causa de las limitaciones de cómo -performSelectorOnMainThread: obras. Sin embargo, en cualquier clase de self es, se podría definir un método como este:

    - (void)doPop {
      [self.navigationController popViewControllerAnimated:YES];
    }

    luego

    [self performSelectorOnMainThread:@selector(doPop)];

    A elaborar por qué la sintaxis no está funcionando:

    El selector pasa a -performSelectorOnMainThread: debe ser un selector que toma ningún argumento, ni un solo argumento de algún tipo de id. Mientras -popViewControllerAnimated: es un selector que toma un único argumento, que el argumento es de tipo BOOL (que por cierto utiliza YES y NO no TRUE y FALSE).

    Así, el @selector será sólo el nombre del método, no el objeto que desea invocar sobre (en este caso, self.navigationController).

    A pensar en términos de objetos de mensajería. Desea que el self.navigationController objeto para realizar la -popViewControllerAnimated: selector en el hilo principal, por lo que se podría construir la mensajería de esa manera:

    [self.navigationController performSelectorOnMainThread:@selector(popViewControllerAnimated:) withObject:nil waitUntilDone:NO];

    Pero el problema no es, de nuevo, el argumento necesario. Así que, ya que no puede invocar directamente pop de esta manera, es por eso que mi sugerencia. Permite hacer invocar perform de acuerdo a su semántica, entonces todavía llamada pop correctamente con su semántica.

    OriginalEl autor hsoi

Dejar respuesta

Please enter your comment!
Please enter your name here