Возврат объекта для метода внутри блока завершения
Я хочу создать метод с параметром URL, который возвращает ответ на вызов этого URL. Как я могу вернуть данные, полученные внутри блока завершения для метода?
class func MakeGetRequest(urlString: String) -> (data: NSData, error: NSError)
{
let url = NSURL(string: urlString)
var dataResponse: NSData
var err: NSError
let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
//How can I return the data obtained here....
})
task.resume()
}
1 ответ
Если вы хотите MakeGetRequest
метод для возврата данных, полученных с помощью dataTaskWithURL
Вы не можете. Этот метод выполняет асинхронный вызов, который, скорее всего, завершается после MakeGetRequest
уже вернулся - но в более общем смысле его нельзя узнать детерминистически.
Обычно асинхронные операции обрабатываются с помощью замыканий - вместо того чтобы метод, возвращающий данные, вы передаете ему замыкание, принимая параметры, возвращаемые в вашей версии кода, - из замыкания, вызванного по завершении dataTaskWithURL
Вы вызываете это закрытие обработчика завершения, предоставляя правильные параметры:
class func MakeGetRequest(urlString: String, completionHandler: (data: NSData, error: NSError) -> Void) -> Void
{
let url = NSURL(string: urlString)
var dataResponse: NSData
var err: NSError
let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
completionHandler(data: data, error: error)
})
task.resume()
}