Actualmente estoy cargando datos provenientes de un servicio JSON
en el método viewDidLoad
en UITableViewController
. El problema es que los datos tardan en recuperarse y analizarse, la vista tarda en crearse. ¿Dónde está el mejor lugar para cargar esta información? Supongo que hay un gancho en alguna parte para cargar datos después de que se crea la vista. Al hacer esto, podré usar algunos UIActivityIndicatorView
en la vista final. Gracias¿Cuándo cargar datos en UITableViewController?
Respuesta
Creo que lo que intentas preguntar es el flujo de trabajo para mostrar datos de un servicio web en una UITableView.
Aquí es lo que recomiendo:
Su
viewDidLoad
hace unNSURLRequest
para su archivo JSON. También agrega una vista de carga a la vista actual (uso unUIView
con un negro bg (0.5 alfa), más una etiqueta y UIActivityIndicator). En este método también establece un BOOL ivar (que debe agregar en su encabezado ) llamadoloaded
a NO.Concat la información
NSURLRequest
, ya que se trata de un objeto de datos mutable .- Cuando sus
NSURLRequest
acabados, lo enciende de datos en una cadena, y analizar el JSON en una matriz de algún tipo (o diccionario si falta). En el mismo método, elimina la vista de carga y cambia su booleanaloaded
a SÍ. A continuación, le dice al tableView para recargar es de datos:[self.tableView reloadData];
Aquí es donde la magia sucede ... en la tabla de métodos vista
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (loaded) return [myArrayOfJSONObjects count];
return 0; // Will only return 0 if the data is not downloaded
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSUInteger row = [indexPath row];
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
if (loaded) {
cell.textLabel.text = [myArrayOfParsedJSONObjects objectAtIndex:row];
//Anything else you want to set
}
else {
//Do nothing :) - you shouldn't reach this else anyway because your numberOfRows method should stop it
}
}
Puede abrir nueva visión y mostrar UIActivityIndicator con el mensaje de usuario, lo que está cargando datos nuevos para él.
En cuanto a mí, esta es la mejor opción, porque la interfaz sigue siendo responsable y el usuario ve lo que realmente hace algo y la aplicación no se cuelga.
abro un nuevo ver con mensaje en cuyo caso dejo este cargador [tableview reloadData] –
Finalmente aquí es una solución basada en los comentarios: Lanzamiento de un hilo en viewDidLoad para obtener datos sin bloquear todo:
- (void) viewDidLoad
{
dataLoaded = NO;
[self initSpinner];
[self launchLoadData];
...
}
-(void)launchLoadData {
NSLog(@"Launching thread");
[NSThread detachNewThreadSelector:@selector(loadData) toTarget:self withObject:nil];
}
- (void) loadData {
dataLoaded = NO;
NSLog(@" thread launched");
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self loadDataFromURL:nil];
dataLoaded = YES;
[self.tableView reloadData];
[pool release];
}
- (void)loadDataFromURL:(NSString*)url {
// start the spinner to show that loading may be time consuming...
[NSThread detachNewThreadSelector: @selector(spinBegin) toTarget:self withObject:nil];
JSONLoader *loader = [[JSONLoader alloc] init];
self.accounts = [loader getAccountsFromURL:@"http://foo/bar/repository.json"];
[loader release];
//[NSThread sleepForTimeInterval:3];
[NSThread detachNewThreadSelector: @selector(spinEnd) toTarget:self withObject:nil];
}
y el uso de la bandera para mostrar o no los datos en la tabla. tableView reloadData hará el resto cuando se llame desde el hilo.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (dataLoaded) return [self.accounts count];
return 0;
}
- 1. Cómo implementar "Cargar 25 más" en UITableViewController
- 2. Recargar UITableViewController
- 3. Cómo volver a cargar datos en el UITableViewController padre desde Modal ViewController
- 4. Toques comenzaron en UITableViewController
- 5. UISearchBar en UITableViewController?
- 6. Margen superior en UITableViewController
- 7. Cargando XIB automáticamente para UITableViewController
- 8. Fallo de aserción en UITableViewController
- 9. Copiar/Pegar funcionalidad en UITableViewController
- 10. Manejo de UITableView vacío en UITableViewController
- 11. ¿Cuándo es demasiado cargar para IIS7?
- 12. UITableViewController no llama
- 13. UITableViewController vs TableView
- 14. UITableView frente a UITableViewController
- 15. UITableViewController - deshabilitar selección
- 16. UITableViewController Imagen de fondo
- 17. uitableviewcontroller seleccione encabezado para la sección
- 18. MySQL: Cargar datos infile
- 19. ¿Cuándo comienza a cargar un iframe en una página?
- 20. Cargar datos CSV en MySQL en Python
- 21. reemplazando loadView en una subclase UITableViewController
- 22. convertir UITableViewController a UIViewController en xcode 4.2
- 23. Error de UITableViewController en el simulador iOS6
- 24. iPhone - Configuración de fondo en UITableViewController
- 25. UITableViewController y el teclado UITextField
- 26. ¿Cómo cargar datos iniciales en MongoDB?
- 27. Cargar datos en Highcharts con Ajax
- 28. ¿Cómo cargar datos rápidamente en R?
- 29. Cómo cargar datos de entrenamiento en PyBrain?
- 30. fácil guardar/cargar datos en python
No exactamente. Esto es lo que ya hago. Cargué datos en viewDidLoad y llené la tabla en cellForRowAtIndexPath. Funciona, pero lo que dije es que en este caso, si el servicio JSON tarda 10 segundos en responder, la vista aparece 10 segundos después de que el usuario lo haya seleccionado. En mi caso, la vista se carga desde otra vista de tabla cuando el usuario hizo clic en una fila. –
Entonces, ¿estás preguntando si hay algún lugar donde puedas cargarlo antes? –
Puedo cargarlo en cualquier lugar, por supuesto, pero lo que quiero hacer es: 1/mostrar la vista (tabla potencialmente vacía) 2/cargar automáticamente los datos del servicio remoto 2 '/ mostrar un mensaje de espera mientras carga –