¿Cómo puedo cargar previamente un UITableView antes de presionar su UIViewController?

Antecedentes: la idea básica de la idea de la aplicación es enviar contenido a amigos de una manera similar a Snapchat. La aplicación ya es funcional, pero ahora estoy intentando algunas mejoras en el performance. En este momento, después de seleccionar el button "siguiente" en la pantalla donde se genera el contenido, hay un retraso porque el controller de vista que se está empujando tiene que cargar un UITableView de alnetworkingedor de 30 celdas. Este fue mi bash anterior para acelerar la transición:

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. self.selectFriendsViewController = [[MPOSelectFriendsViewController alloc] initWithNibName:@"MPOSelectFriendsViewController" bundle:nil]; [self.selectFriendsViewController awakeFromNib]; } 

Cuando se presiona el siguiente button:

 - (void)gotoFriendsPage { [self.navigationController pushViewController:self.selectFriendsViewController animated:YES]; } 

Lo que estoy buscando hacer: Snapchat de alguna manera tiene la list de amigos precargada en todo momento con cero demoras como se ve aquí:

View post on imgur.com

Obviamente están usando un UIPageViewController en lugar de un UINavigationController para ese tipo de efecto, pero mis preguntas son realmente estas:

1. Si cambio el controller de respaldo de UINavigationController a UIPageViewController, ¿este tipo de carga de retraso cero será automático?

2. ¿Hay alguna manera de get un time de carga de retardo cero así con un UINavigationController?

¡Gracias de antemano por tu ayuda!

Editar: Solicitud para mi tabla view cellForRowAtIndexPathCode:

  static NSString *cellIdentifier = @"FriendSelectionCell"; MPOFriendSelectionCell *cell = (MPOFriendSelectionCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[MPOFriendSelectionCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } MPOUser *friend = [self.friendManager.recentFriends objectAtIndex:indexPath.row]; if(friend != (MPOUser *)[NSNull null]) { cell.currentFriend = friend; cell.friendLabel.text = friend.fullName; } return cell; 

No hay una solución de un solo paso para esto. Debe implementar el almacenamiento en caching y mostrar inmediatamente esa información en la interfaz de usuario cuando se carga. Hay muchas forms de almacenar datos en caching. Puede usar NSUserDefaults (no lo recomiendo para big data) o un host de otros methods de caching . Después de eso, necesita cargar perezosamente toda la información nueva y encontrar una manera inteligente de actualizar la información de las celdas que ya representan datos, e insert nuevas filas para los datos nuevos y que aún no están representados en UITableView.

Las llamadas que serán relevantes en su caso serían:

  1. [UITableView reloadRowsAtIndexPaths: withRowAnimation:]
  2. [UITableView insertRowsAtIndexPaths: withRowAnimation:]
  3. [UITableView deleteRowsAtIndexPaths: withRowAnimation:]

Los methods anteriores incluyen una matriz de routes de índice y una UITableViewRowAnimation. Para routes de índice, puede hacer algo como [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0], /*and so on*/ nil];

Sugiero usar un UITableViewRowAnimationFade para filas recargadas, y UITableViewRowAnimationTop / UITableViewRowAnimationBottom para insert o eliminar filas.

Cuando carga inicialmente el controller de vista, use información almacenada en caching para representar las celdas. En su viewDidLoad, genere una llamada en segundo plano que descarga / carga los nuevos datos y una vez que se complete, actualice su UITableView sobre la marcha.

El único inconveniente aquí es que en la primera carga, no habrá datos para mostrar. Usted puede dar un paso paralelo al cargar algunos datos pnetworkingeterminados o marcadores de position para que el usuario tenga algo con lo que pueda jugar mientras carga los datos reales.

Lamento que no haya mucho código que pueda publicar aquí. Su pregunta no tiene una sola solución integral y hay varias maneras en que puede abordar este problema. Mi respuesta es la mejor manera de hacerlo, pero estoy seguro de que hay muchas otras forms en que podría resolver este problema.

Además, ejecute el perfilador de time en los instrumentos … le ayudará a ver qué parte de su aplicación consume la mayor cantidad de time.

El método que he adoptado para situaciones como esta (donde TableView datos de una fuente externa) es save la Array utilizada para la TableView datos NSUserDefaults en NSUserDefaults y luego cargarla primero cuando se viewDidLoad . Después de eso, llamo a mi service web para get datos nuevos y comparar la Array cargada desde NSUserDefaults a la recién descargada Array que obtuve del service web. Si son iguales, no hagas nada. Si son diferentes, actualice TableView y guarde los datos más recientes en NSUserDefaults .

Esto funciona rápido y genial incluso para grandes sets de datos (8000 loggings).