首页 > 解决方案 > 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)

标签: swiftlinuxcallbackurlsession

解决方案


推荐阅读