swift - 如何在 Swift 中等待函数调用结束

标签 swift asynchronous

我的问题很简单,但经过多次研究和测试,我在继续流程之前未能成功等待函数结束。

示例:

print("Before stuff")
do_stuff {
    print("After stuff")
}


func do_stuff(onCompleted: () -> ()) {
    let postEndpoint: String = "http://localhost:8080/users/1234567890987654"
    guard let url = NSURL(string: postEndpoint) else {
        print("Error: cannot create URL")
        return
    }
    let urlRequest = NSURLRequest(URL: url)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)
    let task = session.dataTaskWithRequest(urlRequest, completionHandler: {
    (data, response, error) in
    guard let responseData = data else {
        print("Error: did not receive data")
        return
    }
    guard error == nil else {
        print("error calling GET on /users/1234567890987654")
        print(error)
        return
    }
    // parse the result as JSON
    let user: NSDictionary
    do {
        user = try NSJSONSerialization.JSONObjectWithData(responseData,
            options: []) as! NSDictionary
    } catch  {
        print("error trying to convert data to JSON")
        // Means that user does not exist
        return
    }
    print("The user is: " + user.description)
    })
    task.resume()
    onCompleted()
}

如何在第二次打印之前等待 do_stuff() 结束?

感谢您的帮助,我想我错过了一些东西。

托马斯

最佳答案

有一些基本的东西你还没有理解。它实际上并不是正在执行的函数。它是函数内部定义的闭包。您需要等待的是请求完成后调用的闭包。事实上,您不应该等待,而是在函数外部分配另一个闭包,以便从函数内部的闭包调用。

print("Before stuff")
do_stuff {
    // Now the "function" has completed.
    print("After stuff")
}

func do_stuff(onCompleted: () -> ()) {
    let task = session.dataTaskWithRequest(urlRequest) { data, response, error in
        ...
        onCompleted()
    }
}

关于swift - 如何在 Swift 中等待函数调用结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35210591/

相关文章:

php - 从 PHP 脚本接收 'json_encode' 时 Swift JSON 出错。没有它也能正常工作

swift - 在 Cocoa Swift macOS 应用程序中,有没有办法子类化 AVPlayerView 以获得圆角和阴影?

angular - 测试返回 Promise 的 Angular 2 服务

javascript - 如何在 web pack 2 中异步加载 1 个以上模块?

node.js - Nodejs - 对一次返回 Promise 的函数进行大量 'X' 次调用

swift - ARkit 中未检测到 SceneKit 碰撞

swift - 使用下标 : Cannot subscript a value of type. .. 和类型索引时出错

ios - 使用基本身份验证进行 Rest API 调用

javascript - 使用PDF.js异步加载多个pdf文件时获取总页数

javascript - 从 url 同步进行 base64 编码