0

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?

+0

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

Répondre

0

appeler cette méthode downloadImage sur BackgroundFetch de Appdelegate

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Swift.Void) 

puis en mode débogage, l'application de fonctionner sur l'appareil, puis verrouiller votre téléphone puis de XCode - Debug Menu, sélectionnez Simulate Background Fetch

+0

Merci, mais en fait de cette façon je ne suis pas exactement tester ce que je veux, non? Dans l'exemple que j'ai suivi pour l'utilisation de la session URL d'arrière-plan, la fonctionnalité 'Background fetch' n'est pas activée ... l'exemple est peut-être faux? – AppsDev

+0

Vous pouvez l'activer pour le test de sécurité et ensuite supprimer cette fonctionnalité. C'est juste pour confirmer si la fonction fonctionne en arrière-plan ou non. –