2016-03-21 2 views
0

Je rencontre des problèmes avec la manipulation « d'espace »/erreurs « disque plein » sur ios avec NSURLSessionDownloadTaskquestions NSURLSessionDownloadTask avec stockage presque avertissements de disque plein

Si le disque est plein en raison de téléchargements effectués dans l'application I obtenir un appel à

URLSession (session: NSURLSession, tâche: NSURLSessionTask, erreur didCompleteWithError: NSError)

avec l'erreur ayant un domaine NSPOSIXErrorDomain et le code d'erreur ENOSPC

Mais cela ne Ex: Si j'ai 3 tâches en cours d'exécution à la fois, je reçois seulement ceci pour l'une d'entre elles et les 2 autres restent dans l'état Courant Ils ne reçoivent aucun octets, mais ils n'échouent pas non plus. De plus, appeler annuler sur l'une de ces tâches change leur état de l'exécution à l'annulation et ils restent comme ceci indéfiniment.

Ma solution a été, lorsque j'ai reçu cette erreur la première fois, d'appeler invalidateAndCancel pour la session et gérer l'échec pour toutes les tâches en cours d'exécution. Cela semble fonctionner lorsque le «disque complet» est causé par les téléchargements effectués par l'application. Mais si l'erreur "full disk" est provoquée par des téléchargements externes (Ex: partage de fichiers iTunes, téléchargement de podcasts, autres applications téléchargées), je ne reçois aucune erreur Toutes mes tâches de téléchargement restent dans Running, ou Cancelling (si j'essaie de annuler les) ils ne téléchargent rien, ils ne manquent pas avec l'une des callbacks pour NSURLSessionDelegate ou NSURLSessionDownloadDelegate

Avant de commencer un téléchargement, je vérifie l'espace disponible disponible sur l'appareil Je prends également en considération le moment Tâches en cours d'exécution Mais je n'ai aucun contrôle sur d'autres téléchargements sur le périphérique qui pourraient finir par déclencher l'avertissement "disque entier"

Comment puis-je gérer ces cas? Les tâches de téléchargement doivent-elles rester en cours d'exécution même si elles ne sont plus téléchargées? Est-ce que je ne devrais pas obtenir un appel didCompleteWithError avec (NSPOSIXErrorDomain, ENOSPC) pour chaque tâche, ou pour la session au moins? Ou du moins ne devrais-je pas être en mesure de les annuler avec succès? et obtenir un appel didCompleteWithError quand même?

Y at-il un appel de délégué qui me manque, un qui me ferait savoir qu'il est temps de fermer toutes les tâches en cours?

J'utilise une session de fond commune pour les tâches de téléchargement plus de fond

Les tâches de téléchargement sont créés avec de NSURLSession: func downloadTaskWithRequest (_ demande: NSURLRequest) -> NSURLSessionDownloadTask

La configuration sesion est créée à l'aide de NSURLSessionConfiguration: classe func backgroundSessionConfigurationWithIdentifier (_ identifiant: String) -> NSURLSessionConfiguration

Le seesion est créé à l'aide, NSURLSession de init (configuration configuration: NSURLSessionConfiguration, délégué délégué: NSURLSessionDelegate ?, delegateQueue queue: NSOperationQueue?)

J'utilise un NSOperationQueue avec un maxConcurrentOperationCount de 3 j'ai mis mes NSURLSessionDelegate et NSURLSessionDownloadDelegate

tâches semblent fonctionner bien au premier plan et arrière-plan.

Merci

Ps: en utilisant Xocde7, ios9 sdk, testé sur un dispositif de ios9

Répondre

-1

J'avais aussi demandé à Apple à propos de cette question et la réponse est revenue:

On dirait, parce que l'arrière-plan session utilise le disque pour persister son état, le comportement lorsque le disque est plein n'est pas exactement fiable pour retourner le ENOSPC

Et la gestion du boîtier de disque complet est la responsabilité du développeur pour maintenant par:

  • vérifier l'espace disque avant de lancer un téléchargement

  • espace disque moniteur lorsque l'application est en cours de téléchargement - Si votre application est au premier plan, ou votre application se reprend (ou relancée) en arrière-plan, surveiller activement l'espace disque disponible. Si la valeur est inférieure à un certain seuil, suspendez vos téléchargements (en appelant -cancelByProducingResumeData: vous pourrez donc les reprendre plus tard).

Pour une vérification de la réponse détaillée: https://forums.developer.apple.com/thread/43263