Avant de commencer remarque que cela n'a rien à faire avec le traitement de fond. Il n'y a pas de "calcul" impliquait que l'on pourrait arrière-plan.
Seulement UIKit.
view.addItemsA()
view.addItemsB()
view.addItemsC()
Disons que sur un iPhone 6s
CHACUN d'eux prend une seconde pour UIKit à construire.
Ce qui va se passer:
ILS APPARAISSENT TOUT À LA FOIS. Pour répéter, l'écran se bloque tout simplement pendant 3 secondes alors que UIKit t d'une énorme quantité de travail. Ensuite, ils semblent tous à la fois.
Mais disons que je veux que cela arrive:
ILS APPARAISSENT PROGRESSIVEMENT. L'écran se bloque tout simplement pendant 1 seconde UIKit construit une. Il s'affiche. Il se bloque à nouveau lors de la génération de la suivante. Il s'affiche. Et ainsi de suite.
(Remarque "une seconde" n'est qu'un simple exemple pour plus de clarté. Voir la fin de ce post pour une meilleure exemple.)
Comment voulez-vous faire dans iOS?
Vous pouvez essayer ce qui suit. Il ne semble pas fonctionner.
view.addItemsA()
view.setNeedsDisplay()
view.layoutIfNeeded()
view.addItemsB()
Vous pouvez essayer ceci:
view.addItemsA()
view.setNeedsDisplay()
view.layoutIfNeeded()_b()
delay(0.1) { self._b() }
}
func _b() {
view.addItemsB()
view.setNeedsDisplay()
view.layoutIfNeeded()
delay(0.1) { self._c() }...
Notez que si la valeur est trop petite cette approche simplement, et bien évidemment, ne fait rien. UIKit va tout simplement continuer à travailler. (Quoi d'autre aurait-il?). Si la valeur est trop grande, il ne sert à rien.
Notez qu'actuellement (iOS10), si je ne me trompe pas: si vous essayez cette astuce avec le truc d'un délai de zéro, il fonctionne de manière erratique, au mieux. (Comme vous le feriez probablement s'attendre.)
Voyage de l'exécution de la boucle...
view.addItemsA()
view.setNeedsDisplay()
view.layoutIfNeeded()
RunLoop.current.run(mode: .defaultRunLoopMode, before: Date())
view.addItemsB()
view.setNeedsDisplay()
view.layoutIfNeeded()
Raisonnable. Mais notre récente de la vie réelle de test indique que cela semble ne PAS fonctionner dans de nombreux cas.
(c'est à dire, Apple UIKit est maintenant suffisamment sophistiqué pour frottis UIKit travailler au-delà de cette "astuce".)
Pensée: est-il peut-être un moyen, dans UIKit, pour obtenir un rappel lorsqu'il a, pour l'essentiel, établi tous les points de vue que vous avez empilés? Est-il une autre solution?
Une solution semble être .. mettre les sous-vues dans les contrôleurs, de sorte que vous obtenez un "didAppear" de rappel et de suivi de ces. Qui semble infantile, mais c'est peut-être le seul modèle? Serait-il vraiment, de toute façon? (Simplement une question: je ne vois pas de garantie que didAppear s'assure que tous les sous-vues ont été tirées.)
Dans le cas où ce n'est toujours pas clair...
Exemple de l'utilisation quotidienne de cas:
• Dire qu'il y a peut-être sept sections.
• Dire que chacun prend généralement de 0,01 à 0,20 pour UIKit de construire (selon quelles sont les informations dont vous faites preuve).
• Si vous venez de "laisser tout aller dans un whack" il sera souvent OK " ou "acceptable" (durée totale, dire de 0,05 à 0,15) ... mais ...
• il y aura souvent une tâche fastidieuse pause pour l'utilisateur en tant que "nouvel écran apparaît". (.1 pour .5 ou pire).
• Alors que si vous faites ce que je demande, il restera toujours en douceur sur l'écran, un morceau à la fois, avec le minimum de temps possible pour chaque morceau.