Je suis un exemple de code pour télécharger plusieurs images et les montrer dans les cellules. Pour cela, je configuré un URLSession
comme ceci:Quelle est la meilleure façon de tester une URLSession en arrière-plan?
let backgroundConfig = URLSessionConfiguration.background(withIdentifier: "com.myexample.images")
self.backgroundSession = URLSession(configuration: backgroundConfig, delegate: self, delegateQueue: nil)
Ensuite, je joue le téléchargement d'une image comme ceci:
func downloadImage(imageUrl url: URL, imageId: Int, completion: ImageResult?) -> URLSessionDownloadTask? {
let request = URLRequest(url: url)
let task = backgroundSession.downloadTask(with: request)
// Code here to keep track of the completion handler for this task
task.resume()
return task
}
Je sont également conformes à URLSessionDownloadDelegate
et mettre en œuvre ses didCompleteWithError
, didFinishDownloadingTo
et urlSessionDidFinishEvents
méthodes . Pour cette dernière méthode, j'ai cette mise en œuvre:
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
if let appDelegate = UIApplication.shared.delegate as? AppDelegate, let completionHandler = appDelegate.backgroundSessionCompletionHandler {
appDelegate.backgroundSessionCompletionHandler = nil
completionHandler()
}
}
Et puis dans AppDelegate
:
var backgroundSessionCompletionHandler: (() -> Void)?
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping() -> Void) {
backgroundSessionCompletionHandler = completionHandler
}
Je ne sais pas si cela fonctionne réellement. Je cours l'application dans un simulateur, je vais à la maison du téléphone pour mettre l'application en arrière-plan et je ne suis pas en mesure de voir si ni urlSessionDidFinishEvents
ni les méthodes handleEventsForBackgroundURLSession
de délégué de l'application sont appelés. Peut-être parce que les téléchargements sont trop rapides pour voir cela.
Comment pourrais-je tester correctement dans un simulateur? Est-ce que je manque quelque chose?
J'utilise la communication fond/téléchargements Dans la plupart de mes systèmes: J'utilise une utilisation généreuse des instructions de débogage de la console avec la consignation des combinés réels. Old-school, mais ça marche. – BonanzaDriver