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

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

person Omar Kanawati    schedule 14.01.2015    source источник
comment
Куда вы хотите вернуть эти данные? Что нужно, чтобы это значение было возвращено? Что это будет использовать? Исходя из этого, мы можем начать понимать, что можно сделать.   -  person Danny S    schedule 15.01.2015
comment
stackoverflow.com/questions/ 27650322/   -  person Leo Dabus    schedule 15.01.2015


Ответы (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()
}

Обновление Swift 5:

class func makeGetRequest(urlString: String, completionHandler: @escaping (Data?, Error?) -> Void) -> Void {
    let url = URL(string: urlString)!
    var dataResponse: Data
    var err: NSError

    let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, respone, error) -> Void in
        completionHandler(data, error)
    })

    task.resume()
}
person Antonio    schedule 14.01.2015
comment
что завершениеHandler должно быть @escaping - person hariszaman; 06.04.2019