Возврат объекта для метода внутри блока завершения

Я хочу создать метод с параметром 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()
}
Другие вопросы по тегам