2010-10-08 7 views
1

J'ai une UITableView qui reçoit des données d'un serveur et les met à jour toutes les 1 secondes (en utilisant performSelectorOnMainThread). Puisque cela bloque le fil principal, il n'est parfois pas facile de faire défiler la table et c'est douloureux pour l'utilisateur. Aussi je ne peux pas réduire mon intervalle d'actualisation aussi.Problème de performance UITableView

Quelles sont les solutions possibles à ce problème?

Répondre

0

Utilisation GCD avec des files d'attente (files d'attente en série ou globales). C'est la manière recommandée par Apple maintenant.

dispatch_async(dispatch_get_main_queue(), ^{ 


//do UI updates 

}); 
0

Conservez vos données dans un tableau mutable ou une structure similaire, puis mettez à jour de manière asynchrone ce tableau avec une connexion NSURLConnection. Vous pouvez appeler reloadData sur la tableview pour redessiner la table lorsque le NSURLConnection est terminé.

Vous appelleriez probablement le NSUrlConnection à partir d'un NSTimer à l'intervalle que vous préférez.

+0

J'ai déjà les données aller chercher une partie. (À partir d'une connexion socket) –

+0

Excellent, vous avez juste besoin d'ajuster la façon dont son stockée localement et de fournir cette information à la table. – Ben

1

Je ne rafraîchir les cellules visibles que les changements de données, et les autres comme ils apparaissent donc il sera moins long que la mise à jour du trou UITablaView

vous pouvez obtenir les cellules visibles à l'aide (de UITableView):

- (NSArray *)visibleCells 

et vous pouvez mettre à jour les cellules restantes telles qu'elles apparaissent en utilisant le protocole UITableViewDelegate

– tableView:willDisplayCell:forRowAtIndexPath: 

et je pense que cela devrait mak e un peu plus vite.

0

au lieu d'appeler la fonction performSelectorOnMainThread de NSThread appel

fonction detachNewThreadSelector. De cette façon, votre thread ne bloquera pas le thread principal

[NSThread detachNewThreadSelector: @selector (aMethod :) toTarget: [Classe MyObject] withObject: nil];

dans toTarget: la méthode que vous pouvez écrire auto au lieu de [classe MyObject]

également en écriture sélecteur de mise en œuvre @synchronize (auto) pour par exemple.

- (void) aMethod { @synchronize (auto) {

 //write your whole code here 
    } 

}

Je l'ai fait la même chose dans mon application son travail parfaitement

+0

Vous ne pouvez pas mettre à jour les interfaces utilisateur autres que le thread principal. –

+0

Oui Il est vrai que vous devez recharger manuellement la table après avoir récupéré toutes les données –