Solo en el nuevo iPad 3: wait_fences: no se pudo recibir la respuesta: 10004003

Así que sé que hay muchas preguntas con respecto a esto, pero en la medida en que puedo decir que esta es una situación única, así que pensé que lo publicaría. Con suerte, esto agregará información que finalmente nos dará una respuesta de por qué nos está sucediendo esto. Recibo el error: wait_fences: error al recibir respuesta: 10004003, cuando mi dispositivo gira. La animación de mis vistas se inicia desde:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Solo recibo el error en el nuevo iPad 3. He usado exactamente el mismo programa en un iPad e iPhone originales tan bajos como un 3GS. Todos no reciben el error de wait_fences y todos giran más rápido que el iPad 3.

Utilizo Core Graphics casi exclusivamente para dibujar las vistas. También me aseguro de que se redibujen en un cambio de tamaño para que no obtenga vistas pixeladas. Si deshabilito el redibujado al redimensionar, no recibo este error (pero sí obtengo vistas extendidas). Si deshabilito por completo el dibujo del núcleo, no recibo el error (pero, por supuesto, obtengo vistas en negro).

Utilicé el Time Profiler y descubrí que el bloqueo era principalmente en gradientes de dibujo:

He alterado el código para rellenar en lugar de dibujar gradientes y eso alivia el problema. Diría que los gradientes son el problema, excepto que hago estas animaciones en otras situaciones (excepto en respuesta a la rotación) y funciona bien.

También me gustaría señalar que he prestado especial atención a asegurarme de que solo animo las vistas que están realmente en la pantalla. Sé que animar vistas fuera de la pantalla a veces puede causar este error.

No he incluido el código de animación.

¿Alguna idea de porqué está pasando esto? ¿Especialmente porque solo está sucediendo en el iPad 3?

Para aquellos que pregunten, este es el código que realiza la animación. Normalmente será envuelto en un Bloque de Animación UIView.

- (void) setFramesForFocusView:(CustomControl *)focusView atX:(CGFloat)x showInput:(BOOL)showInput{
    CGSize bSize = self.bounds.size;
    CGRect fRect = focusView.frame;
    fRect.size.width = bSize.width;

    CGRect iRect;
    if (focusView.inputViewIsSystemKeyboard){
        if (_keyboardRect.origin.y < 0 || _keyboardRect.origin.y >= CGRectGetMaxY(self.bounds) || CGRectIsEmpty(_keyboardRect) || CGRectGetMaxY(_keyboardRect) > CGRectGetMaxY(self.bounds)) return;
        iRect = _keyboardRect;
    } else {
        iRect = (focusView.inputUIView && showInput) ? CGRectMake(0, bSize.height / 2, bSize.width, bSize.height / 2) : CGRectZero;
    }

    CGRect iaRect = focusView.inputAccessoryUIView.frame;
    CGFloat availableFieldHeight = iRect.origin.y - iaRect.size.height;

    iRect.size.width = bSize.width;
    iaRect.size.width = bSize.width;

    if (!showInput){
        iRect.origin.y = bSize.height;
    }
    iaRect.origin.y = iRect.origin.y - iaRect.size.height;

    iRect.origin.x = x;
    iaRect.origin.x = x;
    focusView.inputUIView.frame = iRect;
    focusView.inputAccessoryUIView.frame = iaRect;

    if (focusView.expandInput){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    } else {
        if (focusView.labelPlacement != LabelPlacementTop && focusView.labelPlacement != LabelPlacementBottom){
            fRect.size.height = _currentView.storedFrame.size.height + [focusView.label.text sizeWithFont:focusView.label.font].height; 
        }
        fRect.origin.y = availableFieldHeight - fRect.size.height;
    }
    if (fRect.size.height > availableFieldHeight){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    }
    fRect.origin.x = x;
    [focusView setLabelPlacement:LabelPlacementTop toFrame:fRect];
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta