Les données ne se charge pas dans UITableView de défilement jusqu'à ce que je
Je suis en train de charger analysé les données dans les cellules, mais le problème est que cela se passe de façon synchrone et UitableView ne montrent pas jusqu'à ce que les données a fini de charger. J'ai essayé de résoudre le problème en utilisant performSelectorInBackground, mais maintenant, les données ne sont pas chargées dans les cellules jusqu'à ce que je commence à défiler. Voici mon code:
- (void)viewDidLoad
{
[super viewDidLoad];
//Do any additional setup after loading the view, typically from a nib.
[self performSelectorInBackground:@selector(fethchData) withObject:nil];
}
- (void)viewDidUnload
{
[super viewDidUnload];
//Release any retained subviews of the main view.
self.listData = nil;
self.plot=nil;
}
-(void) fethchData
{
NSError *error = nil;
NSURL *url=[[NSURL alloc] initWithString:@"http://www.website.com/"];
NSString *strin=[[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
HTMLParser *parser = [[HTMLParser alloc] initWithString:strin error:&error];
if (error) {
NSLog(@"Error: %@", error);
return;
}
listData =[[NSMutableArray alloc] init];
plot=[[NSMutableArray alloc] init];
HTMLNode *bodyNode = [parser body];
NSArray *contentNodes = [bodyNode findChildTags:@"p"];
for (HTMLNode *inputNode in contentNodes) {
[plot addObject:[[inputNode allContents] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
}
NSArray *divNodes = [bodyNode findChildTags:@"h2"];
for (HTMLNode *inputNode in divNodes) {
[listData addObject:[[inputNode allContents] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
//here you check for PreCreated cell.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
//Fill the cells...
cell.textLabel.text = [listData objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
cell.textLabel.numberOfLines=6;
cell.textLabel.textColor=[UIColor colorWithHue:0.7 saturation:1 brightness:0.4 alpha:1];
cell.detailTextLabel.text=[plot objectAtIndex:indexPath.row];
cell.detailTextLabel.font=[UIFont systemFontOfSize:11];
cell.detailTextLabel.numberOfLines=6;
return cell;
}
- uniquement les cellules visibles sont chargés, reste cellules seront chargés une fois qu'ils apparaissent après le défilement.
Vous devez vous connecter pour publier un commentaire.
Mettre ça quelque part une fois les données chargées avec succès:
Cela résout le problème de l'appel d'une interface graphique mise à jour alors que vous n'êtes pas dans le thread principal.
Ce code utilise le PGCD Technologie d'Apple pour forcer le rechargement des données de la fonction à exécuter sur le thread principal. Lire plus sur
La Simultanéité Guide De Programmation pour plus de compréhension (il est assez grand champ de sorte qu'il est difficile d'expliquer dans le commentaire)
De toute façon, il n'est pas très recommandé si vous ne comprenez pas bien, parce qu'il provoque la panne du programme certains cas rares.
Pour swift 3:
Pour swift 2:
Tous vous avez vraiment besoin de faire est de tout temps, vous avez une mise à jour de vos données back-end, appelez
Depuis ce qui se passe de façon synchrone, vous devriez probablement avoir une fonction comme
et après l'ajout des données dans votre télécharger l'appel
reloadData
méthodeU peut utiliser [cellule setNeedsDisplay];
par exemple:
J'ai eu ce problème et j'ai été traiter avec elle toute la journée.
Je suis en utilisant des cellules statiques et reloadData est à l'origine du mal de chargement, il affiche uniquement les cellules visibles et éliminer les autres.
Ce que j'ai remarqué c'est que quand je défile vers le bas (y'en valeur négative) les cellules où s'est chargé correctement, j'ai donc écrit ce code et cela a fonctionné, même si je n'aime pas laisser de cette façon.
Tirer si vous trouvez une meilleure solution.
J'ai eu exactement le même problème! Je voulais la UITableView d'être entièrement rempli avant que le contrôleur est apparu. Envil post m'a donné les renseignements dont j'avais besoin, mais ma solution a fini par être différentes.
Voici ce que j'ai fait (remodelé pour s'adapter au contexte de la question asker).
Tout d'abord, ce semi-résolu mon problème connexe. Je voulez arrondir les coins d'une image dans une cellule de tableau. Envoi asynchrone résolu le problème pour certains, mais pas à toutes les images. Des idées?
Deuxième, je pense que vous êtes censé éviter la création d'un solide de référence cycle à l'aide d'une fermeture de la liste de capture comme ceci:
Voir: https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID52