Yo uso ZXing para una aplicación, todo ello es el mismo código que el ZXing código original, excepto que me permiten escanear varias veces en una fila (es decir., el ZXingWidgetController no es necesariamente debe despedido tan pronto como algo se detecta).

Tengo la experiencia de un largo tiempo de congelación (a veces no termina nunca) cuando presione el botón descartar que llame

- (void)cancelled {
  // if (!self.isStatusBarHidden) {
  //     [[UIApplication sharedApplication] setStatusBarHidden:NO];
  // }

    [self stopCapture];

    wasCancelled = YES;
    if (delegate != nil) {
        [delegate zxingControllerDidCancel:self];
    }


} 

con

- (void)stopCapture {
    decoding = NO;
#if HAS_AVFF


    if([captureSession isRunning])[captureSession stopRunning];
    AVCaptureInput* input = [captureSession.inputs objectAtIndex:0];
    [captureSession removeInput:input];
    AVCaptureVideoDataOutput* output = (AVCaptureVideoDataOutput*)[captureSession.outputs objectAtIndex:0];
    [captureSession removeOutput:output];
    [self.prevLayer removeFromSuperlayer];

    /*
     //heebee jeebees here ... is iOS still writing into the layer?
     if (self.prevLayer) {
     layer.session = nil;
     AVCaptureVideoPreviewLayer* layer = prevLayer;
     [self.prevLayer retain];
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 12000000000), dispatch_get_main_queue(), ^{
     [layer release];
     });
     }
     */

    self.prevLayer = nil;
    self.captureSession = nil;
#endif
}

(note por favor que la dismissModalViewController que quitar la vista es en el método delegado)

Tengo la experiencia de la congelación, mientras que sólo desestimar sólo si he hecho varios escaneos en una fila, y sólo con un iPhone 4 (no congelar con un 4S)

Alguna idea ?

Saludos

Rom

  • Duro para proveer a nada constructivo. UIKit pone muy confundido y hace cosas como esta si puedes realizar llamadas fuera del hilo principal, pero no en su descripción que mostrar evidencia de que. De lo contrario, no hay nada conocido que hace que se bloquea la forma de describir y nada obvio en lo que has escrito. Así que es probable que algo no demostrado y la única manera de saberlo es a depurar …
  • Veo que no es un problema como el de iOS 9

1 Comentario

  1. 22

    De acuerdo a la AV Cam Controlador de Vista de Ejemplo llamar startRunning o stopRunning no regresar hasta que la sesión finalice la operación solicitada. Puesto que usted está enviando estos mensajes a la sesión en el hilo principal, se congela toda la interfaz de usuario hasta que la operación solicitada completa. Lo que yo recomiendo es que te envuelve tus llamadas Asíncrono, de envío, de modo que la vista no lock-up.

    - (void)cancelled 
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self stopCapture];
        });
    
       //You might want to think about putting the following in another method
       //and calling it when the stop capture method finishes
       wasCancelled = YES;
       if (delegate != nil) {
            [delegate zxingControllerDidCancel:self];
       }
    } 
    • Ten cuidado con eso! stopCapture manipula la vista de jerarquía de acuerdo con el código de arriba. Nunca manipular GUI desde fuera de la interfaz gráfica de usuario hilo.
    • Ahh buen partido @Krumelur sí el [auto.prevLayer removeFromSuperlayer] llamamiento debe ser hecho en el hilo principal
    • Gracias por tu respuesta. Sé que soy un poco tarde pero la ayuda fue muy útil !
    • Por favor upvote la respuesta si te ha gustado!
    • Estoy tratando de implementar esta solución. Yo no entiendo muy bien tu comentario sobre [self.prevLayer removeFromSuperlayer] que se realiza en el hilo principal.
    • No se puede manipular cualquier punto de vista, a menos que se realizan en el hilo principal. El stopCapture llamadas de método removeFromSuperlayer. Quitando y añadiendo, en vista de los elementos siempre se debe llevar a cabo en el hilo principal.

Dejar respuesta

Please enter your comment!
Please enter your name here