La aplicación para iOS se congela en PushViewController

Mi controlador de navegación se congelará de forma intermitente al presionar. Parece agregar el nuevo controlador de vista a la pila, pero la animación nunca tiene lugar. También tengo otros dos contenedores que contienen controladores de vista en la pantalla, y puedo interactuar con ambos muy bien después de que el controlador de navegación se congele. Lo realmente interesante es que si intento insertar otro controlador de vista en la pila del controlador de navegación, noté que hay un controlador de vista adicional en la parte superior de la pila (el controlador de vista que presioné inicialmente que congeló el controlador de navegación). Entonces, si estoy en la pantalla de inicio (lo llamaremos VC-Home) e intento presionar una nueva vista (VC-1) y se congela, entonces trato de presionar una nueva vista (VC-2), Esto es lo que veo en la pila actual antes del empuje:

{ [VC-Home, VC-1] }

y después de llamar a pushViewController, permanece igual; VC-2 no se agrega a la pila.

Por lo que puedo decir, el controlador de navegación inicia la animación haciendo que el controlador de vista anterior esté inactivo antes de que comience la animación, pero luego la animación nunca tiene lugar, dejando el controlador de navegación en estado congelado.

Estoy creando el nuevo controlador de vista desde un guión gráfico llamandoUIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") así que no creo que haya ningún problema allí. Tampoco estoy anulando pushViewController en la barra de navegación. Algunas cosas únicas de mi aplicación es que es muy pesada en imágenes de alta resolución (usando SDWebImage para administrar eso) y siempre tengo tres contenedores en la pantalla a la vez (un controlador de navegación, un controlador de vista para búsqueda y un canal interactivo / menú lateral / deslizable).

El uso de la CPU es bajo y el uso de la memoria es normal (constantemente alrededor de 60-70 MB en el dispositivo cuando se producen bloqueos).

¿Hay alguna idea de lo que podría estar causando esto o algún consejo de depuración que pueda ayudarme a descubrir el verdadero problema?

Actualizar

No hay un código único para UINavigationController ya que solo estoy presionando con pushViewController (). Aquí está el código que lo llama:

func didSelectItem(profile: SimpleProfile) {
     let vc = UIStoryboard.profileViewController()
     vc.profile = profile
     navigationController?.pushViewController(vc, animated: true)
}

El ViewController que introduje tiene el siguiente código en viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    button.roundView()

    if let type = profile?.profileType {
        //load multiple view controllers into a view pager based on type 
        let viewControllers = ProfileTypeTabAdapter.produceViewControllersBasedOnType(type)
        loadViewPagerViews(viewControllers)

        let topInset = headerView.bounds.height + tabScrollView.contentSize.height
        if let viewPager = viewPager {
            for view in viewPager.views {
                if let tempView = view as? PagingChildViewController {
                    tempView.profile = fullProfile
                    tempView.parentVCDelegate = self
                    tempView.topInset = topInset
                }
            }
        }
    }
}

func loadViewPagerViews(viewControllers: [UIViewController]) {
    viewPager?.views = viewControllers
    viewPager?.delegate = self

    //loading views into paging scroll view (using PureLayout to create constraints)
    let _ = subviews.map { $0.removeFromSuperview() }
    var i = 0
    for item in views {
        addSubview(item.view)
        item.view.autoSetDimensionsToSize(CGSize(width: tabWidth, height: tabHeight))
        if i == 0 {
            item.view.autoPinEdgeToSuperviewEdge(.Leading)
        } else if let previousView = views[i-1].view {
            item.view.autoPinEdge(.Leading, toEdge: .Trailing, ofView: previousView)
        }
        if i == views.count {
            item.view.autoPinEdgeToSuperviewEdge(.Trailing)
        }
        i += 1
    }

    contentSize = CGSize(width: Double(i)*Double(tabWidth), height: Double(tabHeight))
}

Actualización 2

Finalmente conseguí congelar de nuevo. La aplicación estaba en segundo plano y la traje de vuelta e intenté presionar un controlador de vista en la pila cuando se congeló. Noté que se estaba produciendo una animación. Tengo una vista de desplazamiento en la parte superior de la página que muestra su contenido cada 10 segundos (piense en el banner superior de las tiendas de aplicaciones). En este congelamiento, noté que el banner estaba a mitad de la animación.

Aquí está la función de desplazamiento de mi UIScrollView que se llama cada 10 segundos:

func moveToNextItem() {
    let pageWidth: CGFloat = CGRectGetWidth(frame)
    let maxWidth: CGFloat = pageWidth * CGFloat(max(images.count, profileImages.count))
    let contentOffset: CGFloat = self.contentOffset.x
    let slideToX = contentOffset + pageWidth

    //if this is the end of the line, stop the timer
    if contentOffset + pageWidth == maxWidth {
        timer?.invalidate()
        timer = nil
        return
    }

    scrollRectToVisible(CGRectMake(slideToX, 0, pageWidth, CGRectGetHeight(frame)), animated: true)
}

No recuerdo haber tenido una parada de empuje debido a una animación / desplazamiento, pero podría estar equivocado.

También volví a comprobar la pila y la misma situación que la descrita anteriormente sigue siendo el caso donde [VC-Home, VC-1] es la pila y no se presiona VC-2. También he revisado las variables de VC-1 y todo se ha cargado (llamadas de datos y cargas de imágenes).

Actualización 3

Esto se está volviendo extraño por segundos. He anulado pushViewController para poder poner un punto de interrupción allí y hacer una depuración basada en la respuesta de Alessandro Ornano. Si presiono un controlador de vista sin éxito, luego envío mi aplicación a un segundo plano, coloco un punto de interrupción en la llamada pushViewController y recupero la aplicación, el punto de interrupción es alcanzado varias veces de inmediato. Si luego continúo pasando todos los golpes, el siguiente controlador de vista de repente se vuelve visible y el último controlador de vista que intenté presionar ahora está en la pila como el último controlador de vista. Esto significa que el que veo todavía está desactivado, lo que esencialmente me coloca en la misma posición que antes.

Respuestas a la pregunta(5)

Su respuesta a la pregunta