我正在尝试使用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页)
答案 0 :(得分:1)
在完成打印数据之前,您已完成信号量的完整信号发送。然后等待退出并终止您的程序。你可以看到它在被打断时开始打印。
将dispatch_semaphore_signal(semaphore)
移至块的末尾。