Acceda a los controlleres de vista ya creados en un UIPageViewController

Estoy usando un UIPageViewController para mostrar imágenes, y descargo las imágenes de forma asíncrona y las lanzo a la galería cuando están lists (pero aún así puedes ir a la página de la galería donde estará la image).

Mi problema es que, cuando la image se carga, necesito suministrarla para el controller de vista al que corresponde. Ahora mismo, lo agrego a una instancia de NSCache , y cuando se UIPageViewController el método de fuente de datos viewControllerAfterViewController: si la image para el controller de vista que se solicita ya se ha descargado (está en el caching) y si es así, Llamo a initWithImage: en el controller de vista específico, pasando la image descargada.

Mi problema es cuando se llama a viewControllerAfterViewController: la image no se ha descargado todavía. En este momento, simplemente cargué el controller de vista sin la image, y cuando se imageDidFinishDownloading: método imageDidFinishDownloading: delegate, bash suministrar el controller de visualización con la image.

Sin embargo, parece que a pesar de que UIPageViewController solicita el siguiente controller de vista, se muestra el anterior (es decir: cuando llego a la tercera página, solicita el controller de vista de la cuarta página) No puedo acceder a este controller de vista solicitado que mano a mano

Si pageViewController.viewControllers a pageViewController.viewControllers , el recuento de NSArray nunca es mayor a 1. Por lo tanto, aunque parece que debería tener 2 (el controller de vista que se muestra actualmente y el siguiente que solicitó), solo tiene uno, el controller de vista actualmente visible.

El problema es que necesito el otro . La image termina de downloadse, y realmente solo tengo dos opciones.

  1. Entréguelo a mi NSCache , de modo que cuando se NSCache el método init para el controller de vista, se entrega.
  2. En el caso de que ya se haya init , déjelo en el controller de vista que ya se init .

Pero 1 no siempre funciona, ya que a veces se init método init cuando todavía no hay image (no se ha terminado de download), por lo que a veces dependemos de 2, pero pageViewController.viewControllers solo contiene el controller de vista visible actual.

Así que básicamente hay una tercera situación en la que el controller de vista ya se ha init sin una image, y la image termina de downloadse y quiero asignarlo a ese controller de vista, pero actualmente estoy en el que tenía antes y mi única reference a los controlleres de vista en UIPageViewController está en el visible actual.

¿Cómo manejo 3? Necesito asignar algo a un controller de vista pero no puedo encontrar ninguna forma de acceder a ese controller de vista .

Solutions Collecting From Web of "Acceda a los controlleres de vista ya creados en un UIPageViewController"

Usaría algo así como un futuro de PMConcurrency para hacer esto. Un futuro es solo un object que promete devolver tu image tan pronto como esté disponible. Entonces, al dar el futuro a su controller de vista en lugar de a la image, no necesita preocuparse acerca de cuándo llega la image.

El inicializador del controller de vista se vería así:

 - initWithImageFuture:(PMFuture *)future { if (self = [super init]) { [[future onMainThread] onComplete:^(id result, NSError *error) { if (!error) { _image = result; } }]; } return self; } 

Al agregar un bloque onComplete al futuro, el controller de vista recibirá la image tan pronto como esté disponible (inmediatamente si la image ya está descargada). Los futuros se ejecutan en segundo plano de manera pnetworkingeterminada, por lo que usaría onMainThread para que el resultado se devuelva en el hilo principal.

Entonces, en lugar de poblar tu caching con imágenes, lo llenarías con futuros de imágenes. Hay varias forms de crear futuros, pero el basado en bloques es bastante simple:

 PMFuture *imageFuture = [PMFuture futureWithBlock:^id{ UIImage *image = ...; // Your image fetching code here return image; }]; [myCache setObject:imageFuture forKey:myImageKey]; 

Tengo un tipo de function similar, pero cargo la image en el controller de visualización que muestra la image (el VC se entregó al UIPageViewController). En su context, creo que tuve la información de ID de image y el object NSCache para el VC. Eso no es lo que quieres hacer, claro, pero es algo en lo que pensar.

Originalmente traté de manejar la carga de imágenes en el padre como tú. Como recuerdo, mantuve un puntero débil al controller de vista de destino. Cuando la image llegó si el VC todavía estaba vivo, podría configurar la propiedad UIImageView.