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)
移动到块的末尾。
我正在尝试在小型命令行客户端中使用 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)
移动到块的末尾。