2009-10-11 6 views
2

Quelle est la meilleure approche pour le partage des données entre les threads en permanence lors de l'utilisation de base de données? Je télécharge un gros fichier et je veux montrer la progression du téléchargement dans un UIProgressBar. Le téléchargement réel se passe dans un fil de fond créé par NSOperation.données de base, les téléchargements de fichiers et thread-safety

Les informations de téléchargement (chemin local, nombre total d'octets, les octets reçus) est modélisé comme un objet géré de base de données et le fichier réel est stocké dans le répertoire Documents /. Une solution qui m'est venue à l'esprit était de créer un contexte d'objet géré séparé dans le thread d'arrière-plan et de le passer le objectID et de le remonter en utilisant la méthode objectWithID:. Chaque fois que le thread d'arrière-plan effectue une sauvegarde, le thread principal reçoit une notification et le contexte principal fusionne ces modifications et la vue de la table est ensuite mise à jour.

Cette approche fonctionne, mais la sauvegarde ne peut pas être fait trop souvent ou l'interface utilisateur se fige. Ainsi, l'interface utilisateur est mise à jour après la réception de chaque X Ko de données où X doit être au moins de 500 Ko pour que l'interface utilisateur soit quelque peu réactive. Existe-t-il une meilleure approche pour transmettre les données de progression de téléchargement au thread principal tel qu'il est reçu?

EDIT: Est-ce que l'aide KVO être d'une aide quelconque? Si oui, connaissez-vous de bons tutoriels sur le sujet?

Répondre

4

Je sais que vous avez déjà construit votre propre système, mais j'utilise ASIHTTPRequest pour toutes mes opérations de réseau. Il est très robuste et offre de nombreux avantages, comme la reprise des fichiers, l'enregistrement direct sur disque, la surveillance de la progression du téléchargement, la surveillance de la progression du téléchargement et l'évier de la cuisine. Si vous ne l'utilisez pas, vous pouvez regarder la source pour voir comment elle le fait parce que l'interface utilisateur ne se fige jamais lorsque j'utilise le rapport d'avancement dans ce cadre.

+0

Tout d'abord, c'est génial d'être en mesure d'upvote! ASIHTTPRequest est vraiment sympa et je vais l'intégrer dans mon code. Il offre beaucoup plus de fonctionnalités que mon petit framework de téléchargement et c'est open source :) – Anurag

0

Bien que je vais utiliser ASIHTTPRequest pour mon projet, il est toujours bon de mentionner ma solution au problème de l'exhaustivité. C'est un peu évident, mais sauvegarder le contexte des données de base aussi souvent que toutes les deux secondes est une erreur terrible. Au lieu de cela, j'ai ajouté un délégué de progression à l'opération de téléchargement, qui obtient une notification de mise à jour sur le thread principal.

NSNumber bytesDownloaded = [NSNumber numberWithLongLong:[data length]]; 
[downloadDelegate performSelectorOnMainThread:@selector(updateProgress:) withObject:bytesDownloaded waitUntilDone:NO]; 

L'important était de transmettre les informations de progression de téléchargement au délégué sur le thread principal. Le délégué met à jour la progression, continue d'accumuler les modifications et enregistre soit lorsque le téléchargement est terminé, soit à des intervalles beaucoup plus longs.

Questions connexes