2011-12-21 5 views
5

Ho una situazione in cui la mia tabella si sta caricando prima di ottenere i dati dal mio webservice.UITableView visualizzato prima di ricevere dati da connectionDidFinishLoading

Quando eseguo il debug, posso vedere che il mio NSMutableArray ha 123 oggetti, ma non viene riflesso nella tabella.

Questo è il mio metodo connectionDidFinishLoading:

-(void)connectionDidFinishLoading:(NSURLConnection *)conn{ 
myData = [[NSString alloc] initWithData:xData encoding:NSUTF8StringEncoding]; 
SBJsonParser *jParser = [SBJsonParser new]; 
NSError *error = nil; 
NSArray *jsonObjects = [jParser objectWithString:myData error:&error]; 
NSMutableArray *books = [[NSMutableArray alloc] init]; 

for(NSDictionary *dict in jsonObjects) 
{ 
    Book *b = [Book new]; 
    b.bookName =[dict objectForKey:@"name"]; 
    b.published = [dict objectForKey:@"published"]; 
    [books addObject:b]; 

} 
self.bookArray = books; 
[self.tableView reloadData]; 
NSLog(@"myData = %@",myData); 
} 

Se metto a punto questo che ricevo la mia jsonObjects e lo ha popolato la mia collezione. Ma noto che il mio tavolo è ancora vuoto.

Giusto per chiarire questo è il mio metodo tableView:

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
... 
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]]; 
cell.textLabel.text = b.bookName; 
.... 

qualcuno mi può aiutare con quello che mi manca?

+0

Vediamo l'intero metodo cellForRow. Hai implementato rowsForSection? – Dancreek

+0

@Dancreek Immagino tu intenda numberOfRowsForSection? Comunque, quello e [tableview reloadData] è stato il mio sospetto quando ho letto l'argomento. Sta chiamando però reloadData, il che elimina quest'ultimo. – barley

+0

- TableView (NSInteger): (UITableView *) tableView numberOfRowsInSection: sezione (NSInteger) { return bookArray.count; } – Matt

risposta

1

Controllare il thread chiamante. Non puoi avere aggiornamenti UIKit su qualcosa di diverso da mainThread. Penso che la tua connessioneDidFinishLoading: chiamato su un thread separato e questo è il problema qui.

Prova

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 
1

È necessario considerare ciò che viene restituito da numberOfRowsInSection (e numberOfSections) per il caso in cui non ci sono dati per mostrare e per il caso in cui ci sono dati da mostrare. Ogni volta che si chiama reloadData, tableView chiamerà questi due metodi per ottenere le ultime informazioni sull'origine dati. Se i tuoi dati non sono stati caricati, questi metodi delegati dovrebbero riportare valori appropriati. Se i dati non vengono caricati, è possibile verificare un valore nullo o eseguire un test simile, quindi restituire i valori appropriati. Dopo aver caricato i dati, i metodi delegati devono restituire i valori in base alle dimensioni dei contenuti nell'origine dati.

Se ci mostri il tuo codice per questi metodi, qualcuno può commentare se questo è il tuo problema.

+0

Sulla tua seconda domanda, puoi semplicemente impostare la proprietà 'nascosta' del tableView se sai che il contenuto è vuoto. Puoi farlo all'interno di uno dei metodi deleegati che ho citato. Ricordati di mostrarlo (nascosto = NO) quando c'è del contenuto da mostrare. – Jim

+0

- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { // Restituisce il numero di sezioni. ritorno 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section { return bookArray.count; } Non ho molto in questi metodi. – Matt

+0

Ho appena eseguito il debug del mio programma e chiama numberOfRowsInSection 1 prima che il mio array venga popolato con i dati e non viene mai più chiamato. – Matt

1

È perché il modo per farlo è, non caricare la tabella finché il contenuto non viene scaricato tramite servizi web.

Per questo non impostare i delegati tramite IB. Dopo il completamento di questa richiesta web, impostare il delegato e l'origine dati tramite codice e quindi chiamare il metodo reloadData. Quindi possiamo aspettare che la tabella venga caricata fino a quando la chiamata web non viene elaborata. Fornire un chiaro indicatore di attività dell'HUD personalizzato durante il caricamento dei dati e fai il lavoro

+1

Aggiungere commenti durante il downvoting –

+0

L'impostazione del delegato è corretta. Nei metodi dell'origine dati, dovrebbe tenere conto del completamento del download. –

+0

"dovrebbe prendere in considerazione se il download è stato completato." Si intende? –

Problemi correlati