9
votes

Recharger des données d'UitailView en arrière-plan

Dans mon application, j'ai un utailviewController.

Sa tableView est divisé en 3 sections. p>

Je télécharge des données pour chacune de ces sections de mon serveur. Pour ce faire, j'ai 3 fonctions (par exemple F1 F2 et F3). Chacune met à jour un nsarray correspondant, utilisé comme source de données pour ma table. P>

Maintenant ce que je veux, c'est recharger des données à l'aide de ces fonctions et actualiser ma tableView une fois que ces 3 fonctions sont effectuées, mais sans déranger l'utilisateur.

Je ne suis pas utilisé avec une demande asynchrone, des blocs, des fils, etc. Et je cherche des conseils. P>

En réalité, voici ce que je fais: p> xxx pré>

Mais ici, ma tableView est "gelée" jusqu'à ce qu'il soit rafraîchi. P>

Je m'en fiche de l'ordre d'exécution de F1 F2 et F3, mais j'ai besoin de attendre que cette 3 fonctions soit effectuée avant de rafraîchir ma tableView. P>

Merci pour votre aide. p>

EDIT P> P> P> P> P> Merci pour Toutes vos réponses. P>

Voici la solution de travail: p>

En tant que suggestions MRES, j'ai supprimé la file d'attente de l'envoi de la vue ViewDidLoad et remplacez-le dans RELODEDATAS: P>

dispatch_async(dispatch_get_main_queue(), ^{ [myDisplayedTable reloadData]; });


0 commentaires

4 Réponses :


2
votes

in reloaddatas code> Méthode Vous devez modifier cette ligne:

dispatch_async(dispatch_get_main_queue(), ^{ [myDisplayedTable reloadData]; });


1 commentaires

Y Avez-vous créé Concurrentqueue?



5
votes

Donc, votre "filetage de fond" est en fait votre fil principal. Vous devez utiliser DisPatch_Get_Global_Queue et spécifier une priorité pour obtenir un fil différent. En outre, la Dispatch ASYNC dans la vue ViewDidLoad est inutile car toutes les méthodes de cycle de vie du contrôleur sont appelées dans le fil principal. Je recommanderais de faire quelque chose comme suit dans vos méthodes F1, F2 et F3:

Démarrez en lançant une demande d'URL asynchrone, puis dans le bloc d'achèvement, mettez à jour ArrayX et rechargez une section particulière de votre TableView. De cette façon, les trois demandes peuvent se produire simultanément et la table vient de mettre à jour les données nécessaires lorsque chacun finit. Sinon, si vous souhaitez uniquement recharger une fois, remplacez simplement la variable ConcurrentQueue que vous avez avec un fil d'arrière-plan, puis effectuez [TableView reloaddata] sur le fil principal.


0 commentaires

3
votes

Les réponses précédentes sont absolument correctes. Cependant, votre implémentation de ReloadDatas & ViewDidload est un peu problématique.

juste pour clarifier:

Vous souhaitez compléter le temps de chargement de données de chargement de données dans un fil d'arrière-plan, puis mettez à jour l'interface utilisateur / les cellules lorsque vos données est prêt sur le fil principal.

Comme: xxx


5 commentaires

J'ai essayé votre solution, mais les interactions utilisateur et le rechargement vous bloquent l'autre. Je veux dire que Reloaderdatas n'est pas appelé puisque l'utilisateur n'a pas cessé de faire défiler la table et que l'utilisateur ne peut pas faire défiler la table pendant que la table n'est pas rafraîchie ...


Êtes-vous sûr que ce n'est pas appelé parce que l'utilisateur fait défiler la table? Essayez d'ajouter quelques nslogs ou points d'arrêt.


Oui, c'est ce que je veux dire par interactions utilisateur : lors du défilement de la table, mon NSTIMER n'appelle pas ma fonction avant la fin du défilement.


Pourquoi utiliser une minuterie en premier lieu? J'ai ajouté une autre réponse pour vous


C'est utile ! Merci



2
votes

une autre chose. Tirer des données d'un serveur et de mises à jour des cellules de table est assez courante. Pas besoin de files d'attente ou de minuteries ici. Voici une structure alternative.

Dis que vous tirez des mp3 de votre serveur: Votre classe modèle est: music.h / m Votre manager modèle est: musicManager.h / m (singleton) - Il contiendra une gamme d'objets de musique - que Singleton est essentiellement votre source de données; et enfin votre UitailViewController: MusicTableVC.h / m P>

dans MusicManager.h / m: Vous avez un nsmutableArraRay strong> qui sera chargé de musique.h des objets que vous tirez de le serveur. Vous pouvez le faire dès que vous appuierez votre application sans même attendre la tableViewController. P>

Inside MusicManager Vous avez quelques méthodes d'assistance pour ajouter ou supprimer des éléments de la MutaBarRayRay et fournir le compte et bien sûr vos méthodes de réseautage. . P>

Enfin: publiez une notification dans votre code de réseau. Votre utailviewController doit écouter / observer cette notification et votre «recharge» en conséquence. P>

 [[NSNotificationCenter defaultCenter] postNotificationName:@"NewMusicAdded" object:nil];


0 commentaires