2010-06-17 4 views
0

J'essaye de recharger une table chaque fois que des données que je reçois du web sont disponibles. Voilà ce que j'ai:cellForRowAtIndexPath appelé trop tard

 
SearchDataViewController: 

- (void)parseDataXML { 
    parsingDelegate = [[XMLParsingDelegate alloc] init];  
    parsingDelegate.searchDataController = self; 
    // CONTAINS THE TABLE THAT NEEDS RE-LOADING;  
    ImplementedSearchViewController *searchController = [[ImplementedSearchViewController alloc] initWithNibName:@"ImplementedSearchView" bundle:nil]; 

    ProjectAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0]; 
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:nav, searchController, nil]; 
    self.splitViewController.viewControllers = viewControllers; 
    [viewControllers release]; 
    // PASS A REFERENCE TO THE PARSING DELEGATE SO THAT IT CAN CALL reloadData on the table  
    parsingDelegate.searchViewController = searchController; 

    [searchController release]; 

    // Build the url request used to fetch data 
    ... 
    NSURLRequest *dataURLRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]]; 
     parsingDelegate.feedConnection = [[[NSURLConnection alloc] initWithRequest:dataURLRequest delegate:parsingDelegate] autorelease]; 

} 
 

ImplementedSearchViewController: 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"count = %d", [keys count]); 
    // keys IS A NSMutableArray 
    return [self.keys count];  
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 
    cell.textLabel.text = [keys objectAtIndex:row]; 
    ... 
} 
 

XMLParsingDelgate: 

-(void) updateSearchTable:(NSArray *)array { 
    ... 
    [self.currentParseBatch addObject:(NSString *)[array objectAtIndex:1]]; 
    // RELOAD TABLE 
    [self.searchViewController.table reloadData]; 
} 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 

    if ([elementName isEqualToString:@"..."]) { 
     self.currentParseBatch = [NSMutableArray array]; 
     searchViewController.keys = self.currentParseBatch; 
       ... 
    } 
     ... 
} 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"..."]) { 
       ... 
     [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO]; 
     } 
     ...  
} 
 

Mon problème est que quand je debug, les appels vont entre reloadData et numberOfRowsInSection jusqu'à ce que le tableau de clés est rempli avec les dernières données, le temps où le cellForRowAtIndexPath est appelé:

 
reloadData -> numberOfRowsInSection 
reloadData -> numberOfRowsInSection 
... 
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath 

ce que je veux est la table à jour pour chaque élément que j'envoie, un par un:

 
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath 
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath 
... 
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath 

Toutes les idées pourquoi ce comportement?

Merci!

Répondre

0

Changement [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO];-[self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:YES]; résolu mon problème.

0

Demandez-vous comment charger des parties de la table instad de l'ensemble? Si oui, alors u peut utiliser relaodRowsAtINdexPath: ou reloadSectionsAtIndexPath à cette fin, voici une référence TableView ref ...

+0

No. Mon problème est que reloadData n'appelle que numberOfRowsInSection, et non cellForRowAtIndexPath. Lorsque le tableau kjeys est rempli, après l'appel de numberOfRowsInSection pour la dernière fois, cellForRowAtIndexPath est appelé. –

+0

pas sûr que je suis, reloadData recharge toute la tableview, alors numberOfRows sera appelé en premier, puis il appellera cellForRowatIndexPath pour toutes les lignes ... – Daniel

+0

C'est le problème, cellForRowatIndexPath n'est pas appelé après l'appel de numberOfRowsInSection, il obtient seulement appelé après que mon tableau de clés a été rempli avec le dernier élément. J'ai mis à jour la dernière partie de mon post original pour mieux expliquer la situation. –

0

Le problème est avec votre utilisation de fils pas avec « juste » tourner un drapeau ou Off.Perform le sélecteur sur un thread différent et il commencerait à work.You peut également utiliser performSelectorOnBackground

Questions connexes