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