2016-11-17 2 views
1

Bonjour à tous ceux que je suis sur le point de créer une extension pour URLSession dans swift 3 pour créer une requête synchrone et asynchrone. Voici mon implémentationIOS Swift 3 créer une extension URLSession pour une requête synchrone et asynchrone

extension URLSession { 
    func sendSynchronousRequest(request: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) { 
     let semaphore = DispatchSemaphore(value: 0) 

     let task = self.dataTask(with: request) { (data, response, error) in 
      completionHandler(data,response,error) 
      semaphore.signal() 
     } 
     task.resume() 
     semaphore.wait(timeout: .distantFuture) 
    } 

    func sendAsynchronousRequest(request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask { 
     let task = self.dataTask(with: request) { data, response, error in 
      completionHandler(data, response, error) 
     } 
     task.resume() 
     return task 
    } 
} 

Je Xcode me conseille d'insérer la @escaping à la fonction. Je ne sais pas si la mise en œuvre est correcte

j'ai aussi un avertissement à cette ligne enter image description here

Quelqu'un sait comment corriger l'extension? L'aide est très appréciable! Merci!

Répondre

9

J'ai trouvé cette implémentation mais dans swift1/2 je ne m'en souviens pas. Ce n'est pas le mien. Mais je l'ai réécrit en swift3. Je ne me souviens pas où je l'ai trouvé:/

func synchronousDataTaskWithURL(url: URL) -> (Data?, URLResponse?, Error?) { 
    var data: Data?, response: URLResponse?, error: Error? 

    let semaphore = DispatchSemaphore(value: 0) 

    dataTask(with: url) { 
     data = $0; response = $1; error = $2 
     semaphore.signal() 
     }.resume() 

    semaphore.wait() 

    return (data, response, error) 
} 
+0

Merci beaucoup. Comment pouvons-nous utiliser la fonction? par exemple pour imprimer les données et ensuite exécuter une autre tâche en série? la fonction asynchrone est-elle correcte avec @escaping? –

+0

URLSession a déjà une fonction Async URLSession.shared.dataTask (avec: , completionHandler: <(Data ?, URLResponse ?, Erreur?) -> Void>) –

+0

merci donc nous pouvons utiliser l'async par défaut pas besoin d'envelopper? J'ai essayé d'utiliser le synchrone avec let data = result.0 let stringData = Chaîne (données: données!, Codage: .utf8). mais avoir une erreur nulle. Est-ce la bonne façon? –