2016-08-15 1 views
-1

Je suis nouveau à Swift et j'ai une question concernant les appels synchrones. Je voudrais effectuer un appel synchrone à dataTaskWithRequest, de sorte que la méthode de retour soit appelée une fois que la méthode dataTaskWithRequest est terminée. Voici mon code:Swift attendre jusqu'à ce que dataTaskWithRequest a fini d'appeler le retour

private func sendRequest (request: NSURLRequest) -> NSData{ 
    let session = NSURLSession.sharedSession() 
    var dataReceived: NSData = NSData() 
    let task = session.dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      print("Error -> \(error)") 
      return 
     } 
    dataReceived = data! 
    } 
    task.resume() 
    return dataReceived 
} 

Quelle est la meilleure façon de le faire? J'ai essayé avec un gestionnaire de complétion mais je ne suis pas capable de le faire.

Merci beaucoup d'avance pour votre aide.

+0

Merci Eva, je n'ai pas tez-le – user3149877

Répondre

0

l'achèvement est le droit et le meilleur moyen de rapidité!

func sendRequest (request: NSURLRequest,completion:(NSData?)->()){ 

    NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      return completion(data) 
     }else{ 
      return completion(nil) 
     } 
    }.resume() 
} 

et appelez:

sendRequest(yourRequest) { data in 
     if let data = data { 
      // do something 
     } 
    }} 
+0

Merci Nikolai! Ça fonctionne bien – user3149877

1

La meilleure façon de le faire est une fonction de rappel.

private func sendRequest (request: NSURLRequest, callback: (data: NSData) ->() { 
    let session = NSURLSession.sharedSession() 
    var dataReceived: NSData = NSData() 
    let task = session.dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      print("Error -> \(error)") 
      return 
     } 
     callback(data!) 
    } 
    task.resume() 
} 

Vous pouvez appeler cette fonction comme celui-ci

self.sendRequest(request, { (data) in 
    //data is the data you get from the request 
} 
1

Vous pouvez transformer un synchrone appel asynchrone avec un sémaphores comme ceci:

private func sendRequest(request: NSURLRequest) -> NSData { 
    let session = NSURLSession.sharedSession() 
    var dataReceived: NSData = NSData() 
    let sem = dispatch_semaphore_create(0) 

    let task = session.dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      print("Error -> \(error)") 
      return 
     } 

     dataReceived = data! 
     dispatch_semaphore_signal(sem) 
    } 

    task.resume() 

    // This line will wait until the semaphore has been signaled 
    // which will be once the data task has completed 
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER) 
    return dataReceived 
} 

Ensuite, vous utilisez la fonc comme ceci:

let url = NSURL(string: "http://www.google.com")! 
let req = NSURLRequest(URL: url) 
let data = sendRequest(req) 
print("This is data: \(data)")