Optimisation: appeler son modèle au fur et à mesure d'un affichage

Dans un projet j'ai une grosse requête SQL bien compliquée dans un modèle.
Cette requête peut charger jusqu'à 1000 lignes.
Dans la boucle qui suit cette requête (qui va donc boucler 1000 fois), j'ai une autre requête simple. Je sais, les requêtes imbriquées c'est le mal, mais parfois on ne peut pas faire autrement vu la complexité des informations qu'on souhaite obtenir.
Ma question: ne vaut-il pas mieux appeler la requête de la boucle lors de l'affichage des éléments ?
Cas typique: une UITableView.
A quoi bon demander tout de suite les 1000 requêtes, si on affiche que 20 lignes en même temps dans sa table ? Pourquoi ne pas demander la requête simple au moment de l'affichage (toujours en appelant le modèle évidemment) ?
Si on ne scroll pas, ces requêtes ne seront jamais appelées. Evidement, au moment du scroll on va perdre un peu de temps de calcul, en plus de l'affichage, mais n'est-ce pas mieux ?
Cette requête peut charger jusqu'à 1000 lignes.
Dans la boucle qui suit cette requête (qui va donc boucler 1000 fois), j'ai une autre requête simple. Je sais, les requêtes imbriquées c'est le mal, mais parfois on ne peut pas faire autrement vu la complexité des informations qu'on souhaite obtenir.
Ma question: ne vaut-il pas mieux appeler la requête de la boucle lors de l'affichage des éléments ?
Cas typique: une UITableView.
A quoi bon demander tout de suite les 1000 requêtes, si on affiche que 20 lignes en même temps dans sa table ? Pourquoi ne pas demander la requête simple au moment de l'affichage (toujours en appelant le modèle évidemment) ?
Si on ne scroll pas, ces requêtes ne seront jamais appelées. Evidement, au moment du scroll on va perdre un peu de temps de calcul, en plus de l'affichage, mais n'est-ce pas mieux ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Par contre, tu peux faire du prefetching en background.
Par exemple typiquement tu prévois un NSArray de 1000 éléments prêt à contenir tes résultats de tes 1000 requêtes.
Puis une fois ta requête principale exécutée, tu boucles sur tes 1000 résultats de cette requête principale, et pour chacun, tu construits ta requête SQL secondaire correspondante, et tu la lances dans une NSOperation asynchrone. Chaque opération asynchrone va exécuter sa requête SQL puis récupérer le résultat (et construire un NSObject pour le représenter) et stocker ce résultat dans ton NSArray. Bon il faut prévoir :
Bon j'ai rien testé de tout ça, j'ai tout tapé en live donc je te laisse vérifier.
Tu me ponds ça juste avant l'heure de l'apéro ! T'es fou !
Je crois que j'ai à peu près compris le principe. Je vais tester ça très prochainement, d'autant plus qu'en fait j'ai peut-être 3 ou 4 sous requêtes et pas 1.
Pour info, ma requête principale fabrique actuellement un array de dicos dans le modèle. Array qui sera épluché à la lecture dans l'UITableView. Du classique.
Utiliser les block ne me gène plus car les prochaines versions de mon app seront iOS 4 et >.
Merci pour cette grosse suggestion et ce gros bout de code !