2017-05-28 1 views
0

Heyho,Swift - Forcer la vue pour charger les données après avoir apparu

J'ai eu un petit problème avec deux de mes contrôleurs de vue. Ce sont deux contrôleurs de vue de collection. Mon problème est, si je clique sur le bouton pour ouvrir la deuxième vue il est en retard et la transition n'est pas liquide. La raison de ce décalage est le tas de données que la vue charge pour la vue de collection (environ 400 photos et chaînes). Peut-être que quelqu'un d'entre vous a eu une idée de comment je pourrais vaincre cette inhibition de chargement. Si vous avez besoin de plus d'informations -> il suffit de demander.

Répondre

2

Un moyen facile de résoudre ce problème est de vous charger des données dans un thread d'arrière-plan et de recharger votre point de vue de la collecte (dans le thread d'interface utilisateur) quand il est fait:

DispatchQueue.global(qos: .background).async { 

    // load your data here 

    DispatchQueue.main.async { 
     // reload your collection view here: 
     self.collectionView.reloadData() 
    } 
} 
+0

Belle solution, mais je ne comprends pas devaient utiliser le terme "charger les données ici" dans mon cas. Les données sont chargées dans les méthodes de collectionView, et je ne changerai vraiment pas cela (ce n'est pas possible du tout). Et j'ai essayé le code dans "viewWillAppear", mais il a fait du retard. C'est parce que les méthodes collectionView sont appelées avant que la vue n'apparaisse. Peut-être que vous comprenez mon problème et que vous pouvez m'aider à utiliser votre code correctement. Merci :) –

+0

Sry, je veux dire les données (les photos et les chaînes sont stockées dans des tableaux), ils ne doivent pas être chargés. La raison pour laquelle il n'y a pas de transition liquide est que le collectionView a besoin de si longtemps pour insérer les données des tableaux. Si j'ouvre la vue une fois de plus, il n'y a pas de décalage. –

+0

Chargez-vous toutes vos données (en particulier les images) dans la méthode "viewDidLoad" ou "viewWillAppear"? Ou dans le "cellForItemAtIndexPath"? Où que vous chargiez réellement les données, vous devez le faire dans un fil d'arrière-plan –

0

vous pouvez utiliser cette méthode pour atteindre le nécessaire résultat.

override func viewDidLayoutSubviews() { 
    // Configure the views 
} 

D'autre part, vous avez self.view.setNeedsLayout() et self.view.layoutIfNeeded(). Trouvez celui qui vous convient.