Swift信号量似乎过早退出

时间:2015-03-30 13:25:46

标签: json swift asynchronous

我正在尝试使用yts' API(https://yts.to/api)在一个小型命令行客户端中。 因此,我使用带有NSUrlSession的标准dataTask来获取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()
}

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

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页)

1 个答案:

答案 0 :(得分:1)

在完成打印数据之前,您已完成信号量的完整信号发送。然后等待退出并终止您的程序。你可以看到它在被打断时开始打印。

dispatch_semaphore_signal(semaphore)移至块的末尾。