UITableView insertSections: withRowAnimation: à l'origine de toutes les cellules du tableau pour être demandées
Je suis en train de travailler sur la modification de certains lourde de code qui appelle simplement [tableView reloadData]
sur tout changement, à l'utilisation plus spécifique de la mise à jour avec les insérer/supprimer des méthodes.
Cependant, je suis vraiment un mauvais comportement. Précédemment, que l'on pourrait imaginer, lors de la table chargée, elle ne demande que les cellules pour les lignes qui ont été visibles à l'époque. C'était le comportement lors de l' reloadData
a été utilisé.
Maintenant que insertSections
est appelé, tous cellules sont demandées après cette mise à jour, qui peuvent être des centaines. Cette résultats dans les cellules en cours de création pour chaque ligne, complètement ruiner la réutilisables cellule de la file d'attente et d'être juste tout autour de gaspillage. Je doit être en train de faire quelque chose de mal.
Le changement est aussi simple que cela, le code que les résultats de la tableView demande seulement pour les lignes visibles:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
//... ensure it's the right key
[tableView reloadData];
}
Code que les résultats de la tableView demande tout:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
//... ensure it's the right key
NSUInteger sectionCount = [self sectionCount];
NSIndexSet *indices = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)];
[tableView insertSections:indices withRowAnimation:UITableViewRowAnimationFade];
}
Je peux basculer d'avant en arrière pour voir le changement de comportement. Frustrant. Des idées?
L'ajout d'une prime juste pour voir si quelqu'un a des plus de perspicacité.
La beginUpdates/endUpdates n'a rien, et je ne m'attends pas, c'est juste une commande, il n'y a rien de plus à se fondre dans une seule mise à jour.
Je pense que c'est simplement un effet secondaire de désirer l'animation. Tout ce qui est "slide", il a tout pour rendre. Game over.
J'ai créé un petit projet de test et peut reproduire le comportement que vous observez. C'est vraiment curieux. Ne peut pas être l'animation seul, car le comportement est le même si vous spécifiez UITableViewRowAnimationNone. Le problème ne se produit pas si l'insert n'est pas à l'écran lors de la insertSections:withRowAnimation: est appelé.
OriginalL'auteur Nick Veys | 2009-07-25
Vous devez vous connecter pour publier un commentaire.
Il semble que vous dites la table à insérer dans toutes les sections, qui est en fait l'équivalent d'un rechargement. Lorsque vous dites à la table, il doit charger un article, il doit lire tous les articles de cette section. Aussi, vous le faites en dehors d'un beginUpdates/endUpdates bloc, ce qui signifie que chaque fois que vous ajoutez dans la section de la table doit engager immédiatement les modifications. Si vous enveloppez le tout à l'intérieur d'un beginUpdates/endUpdates qu'il va suspendre toutes les requêtes jusqu'à ce qu'il se fait qui va permettre au système de s'unir redondant requêtes et d'éliminer les requêtes qui s'avèrent ne pas être nécessaire.
Vous devez seulement appeler insertSections avec de nouveaux articles qui sont ajoutés. Si vous le faites alors tableview n'a pas à interroger les informations de toutes les inchangée sections, même si ils se déplacent. Aussi, si des éléments à l'intérieur d'une section de changement, mais l'article lui-même ne fonctionne pas vous devez utiliser la version de ligne de l'méthodes pour modifier ces lignes à l'intérieur de la section, et seules les lignes obtiendrez interrogé.
Ci-dessous est un exemple (à partir d'un CoreData en fonction app) qui devrait obtenir le point à travers. Puisque vous avez un modèle personnalisé à la place d'une NSFetchedResultsController vous devez comprendre le type d'action en cours au lieu de simplement vérifier un tas de constantes remises par le système.
Non, c'est prévu, et pourquoi vous avez besoin de la beginUpdates/endUpdates appels d'emballage de ce que vous faites. Sans ceux de la tableView a supposer que, après chaque modification, vous n'aurez peut avoir un impact sur l'affichage, ce qui signifie qu'il a à la requête de toutes les sections de calculer ce que les cellules sont visibles, et puis obtenir toutes les qui sera visible. Lorsque vous faites un beginUpdates la tableView arrête la mise à jour jusqu'à ce que vous appelez endUpdates, à quel point il peut tout faire en une seule fois avec l'interrogation de tous vos états intermédiaires.
"sans l'interrogation des états intermédiaires," j'ai besoin de plus de café
OriginalL'auteur Louis Gerbarg