Swift 信号量似乎过早退出

Swift semaphore seems to exit prematurely

我正在尝试在小型命令行客户端中使用 yts 的 API (https://yts.to/api)。 因此,我使用带有 dataTask.

的标准 NSUrlSession 获取 JSON 文件
func httpGet(request: NSURLRequest!, callback: (String, String?) -> Void) {
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request) {
        (data, response, error) -> Void in
        if error != nil {
            callback("", error.localizedDescription)
        } else {
            var result = NSString(data: data, encoding: NSASCIIStringEncoding)!
            callback(result, nil)
        }
    }
    task.resume()
}

为了防止程序在加载文件之前退出,我通过 Wait until an asynchronous api call is completed - Swift/IOS 添加了 GCD。

var semaphore = dispatch_semaphore_create(0)
let adr = "https://yts.to/api/v2/list_movies.json"
var request = NSMutableURLRequest(URL: NSURL(string: adr)!)
httpGet(request) {
    (data, error) -> Void in
    dispatch_semaphore_signal(semaphore)
    if error != nil {
        println(error)
    } else {
        println(data)
    }
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)

这应该保持过程 运行 直到 httpGet 完成,或者我误解了什么? 但是,它永远不会走到这一步,而是很快就会中断:

{"status":"ok","status_messagProgram ended with exit code: 0

{"status":"ok","status_meProgram ended with exit code: 0

或类似无用的东西(整个文件在 200*50 终端上大约有 2 页)

您是在完成数据打印之前向信号量发出完成信号。因此等待退出并终止您的程序。可以看到打断了才开始打印

dispatch_semaphore_signal(semaphore) 移动到块的末尾。