ios - 如何在 Swift 2 的嵌套函数中设置全局函数的参数

标签 ios swift swift2

我正在尝试使用 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/

相关文章:

ios - 快速注册并登录

快速代码生成文件错误

ios - 当 ViewController 被呈现的 ViewController 覆盖时触发事件

Swift 2/iOS 9 - 找不到 libz.dylib

ios - 为什么 UIView 不会显示第二次?

ios - 如何在 swiftUI 3.0 中由 .searchable 召唤的键盘上显示 .toolbar?

swift - 在 swift 中设置一个泛型类作为委托(delegate)

ios - 为 iTunes Connect 存档时的 Cocoa 框架问题

iOS UI 通知栏过渡

ios - 如何在导航栏右侧显示注销按钮以从应用程序注销?