swift - Swift 函数在它的 return 语句上产生一个“SIGILL”
问题描述
我正在用 Swift 编写一段代码来访问公共 API 端点以提取 JSON 中的数据并在应用程序中使用它。我正在使用 URLSession 来执行请求,并且正在使用 async/await 类似的范例从 URLSession 回调中提取数据并将其放置在局部变量中。然后,该函数将 JSONSerialization 返回的可选字典返回给调用者。
这段代码在函数外部执行得非常好,并作为主程序的一部分运行,但是一旦它被移动到函数中,return 语句就会产生“SIGILL”退出。
我对 return 语句进行了断点,发现它正是引发此错误的原因。由于这是一个可选字典,我尝试只返回字典的展开版本并找到相同的结果。我也试过只返回一个空白字典,但我仍然得到一个 SIGILL
功能:
let url = URL(string: <endpointURL>)!
var tenant: [String: Any]? = nil;
let sem = DispatchSemaphore(value: 1)
sem.wait()
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
do {
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
if let json = json {
print(json)
tenant = json
sem.signal()
} else {
print("ERR: Null JSON")
}
} catch let error as NSError {
print("ERR: " + error.localizedDescription)
}
} else if let error = error {
print("ERR: " + error.localizedDescription);
} else {
print("ERR: Unknown")
}
}
print("resuming")
task.resume()
print("waiting: ")
sem.wait()
print("done waiting")
print(tenant!["tenant_name"]!)
失败:
let _ = HttpHelper.getTenantFor(tenantId: <someUUID>)
class HttpHelper {
static func getTenantFor(tenantId: String) -> [String:Any]? {
let url = URL(string: <endpointURL>)!
var tenant: [String: Any]? = nil;
let sem = DispatchSemaphore(value: 1)
sem.wait()
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
do {
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
if let json = json {
print(json)
tenant = json
sem.signal()
} else {
print("ERR: Null JSON")
}
} catch let error as NSError {
print("ERR: " + error.localizedDescription)
}
} else if let error = error {
print("ERR: " + error.localizedDescription);
} else {
print("ERR: Unknown")
}
}
print("resuming")
task.resume()
print("waiting: ")
sem.wait()
print("done waiting")
return [String:Any]()
}
}
在功能代码上,应用程序为 JSON 对象中的“tenant_name”键输出正确的值,在失败的代码中我得到以下信息:
Process finished with exit code 132 (interrupted by signal 4: SIGILL)
解决方案
推荐阅读
- java - 如何创建循环,在其中根据用户输入创建星形金字塔
- concurrency - Geth 服务在 web3.personal.importRawKey 函数的多个并发请求中被杀死
- html - 在 ReactJS Card 中显示图像
- java - 拆分不在下划线之间的大写单词
- android - 由于图像已关闭,ML Kit Barcode 进程失败
- javascript - 以编程方式更改 Youtube 上的下一个视频
- matplotlib - 如何通过 matplotlib 和 scipy 显示 pmf 的峰值?
- ios - 为什么我的垂直编程滚动视图在 Swift 中不起作用
- if-statement - Gitlab-CI:有条件的allow_failure
- python - 在 Cython 中使用 clang