返回完成块内方法的对象

时间:2015-01-14 22:37:20

标签: swift ios8 closures nsurlsession completion-block

我想创建一个带有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 个答案:

答案 0 :(得分:3)

如果您希望MakeGetRequest方法返回通过dataTaskWithURL获得的数据,则无法执行此操作。该方法执行异步调用,这很可能在MakeGetRequest已经返回后完成 - 但更一般地说,它不能以确定的方式知道。

通常,异步操作是通过闭包来处理的 - 而不是你的方法返回数据,你传递一个闭包,接受你的代码版本中返回的参数 - 来自{{1}完成时调用的闭包,你调用完成处理程序闭包,提供适当的参数:

dataTaskWithURL

Swift 5更新

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