我正在尝试使用 Swift2 创建 HTTP 请求并在嵌套函数之外返回响应。我的代码如下所示:
let session = NSURLSession.sharedSession()
let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error)
} else {
let httpResponse = response as? NSHTTPURLResponse
print(httpResponse)
print(data)
// return data
}
我想在嵌套函数之外返回数据变量。或者在嵌套函数之前定义一些其他变量,我可以在嵌套函数内部设置这些变量。像这样:
var test = "";
// some nested function
let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
test = "test"
})
有人对这个问题有什么建议吗?
最佳答案
如果你想同步等待数据任务完成以便返回获取的数据,你必须使用信号量。
func getDataSynchronously(request: NSURLRequest) -> NSData? {
var returnData: NSData?
let semaphore = dispatch_semaphore_create(0)
let dataTask = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in
returnData = data
dispatch_semaphore_signal(semaphore)
})
dataTask.resume()
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
return returnData
}
信号量将强制调用线程停止并等待,直到它在数据任务完成时收到信号。调用上面的函数看起来像这样
let request = NSURLRequest(URL: NSURL(string: "https://www.google.com")!)
let data = getDataSynchronously(request)
print("Synchronously fetched \(data!.length) bytes")
另一方面,如果您想在后台启动数据任务并异步通知其完成,您可以将自己的完成 block 添加到函数的签名中。
func getDataAsynchronously(request: NSURLRequest, completion: NSData? -> ()) {
let dataTask = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in
completion(data)
})
dataTask.resume()
}
调用异步方法可能是这样的
let request = NSURLRequest(URL: NSURL(string: "https://www.google.com")!)
getDataAsynchronously(request) { data in
print("Asynchronously fetched \(data!.length) bytes")
}
关于ios - 如何在 Swift 2 的嵌套函数中设置全局函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32802588/