2016-08-15 4 views
-1

Я новичок в Swift, и у меня есть вопрос о синхронных вызовах. Я хотел бы сделать синхронный вызов dataTaskWithRequest, так что метод return вызывается после завершения завершения dataTaskWithRequest. Вот мой код:Swift wait до тех пор, пока dataTaskWithRequest не закончит, чтобы вызвать возврат

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 
} 

Каков наилучший способ сделать это? Я пробовал с обработчиком завершения, но я не в состоянии это сделать.

Благодарим вас за помощь.

+0

Thanks Eva, ai did not no tice it – user3149877

ответ

0

завершение - это правильный и лучший способ быстро!

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() 
} 

и называют:

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

Спасибо, Николай! Он отлично работает – user3149877

1

Лучший способ сделать это функция обратного вызова.

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() 
} 

Вы можете вызывать эту функцию как этот

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

Вы можете включить асинхронный синхронный вызов с семафором, как это:

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 
} 

Тогда вы используете FUNC так:

let url = NSURL(string: "http://www.google.com")! 
let req = NSURLRequest(URL: url) 
let data = sendRequest(req) 
print("This is data: \(data)") 
Смежные вопросы