【问题标题】:Return object for a method inside completion block返回完成块内方法的对象
【发布时间】:2015-01-14 22:37:19
【问题描述】:

我想创建一个带有 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()
}

【问题讨论】:

标签: swift ios8 closures nsurlsession completion-block


【解决方案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()
}

【讨论】:

  • completionHandler 必须是@escaping
猜你喜欢
  • 2015-09-21
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多