Я пишу кусок кода в Swift для достижения конечной точки общедоступного API, чтобы получить данные в JSON и использовать их в приложении.Я использую URLSession для выполнения запроса и использую асинхронную / ожидающую подобную парадигму для извлечения данных из обратного вызова URLSession и помещения их в локальную переменную.Затем функция возвращает необязательный словарь, возвращаемый JSONSerialization вызывающей стороне.
Этот код прекрасно выполняется вне функции и запускается как часть основной программы, но как только он перемещается в функцию,оператор return создает выход "SIGILL".
Я остановился на операторе возврата и обнаружил, что именно это вызывает эту ошибку.Поскольку это необязательный словарь, я попытался вернуть развернутую версию словаря и нашел те же результаты.Я также попытался просто вернуть пустой словарь, и я все еще получаю 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]()
}
}
В работающем коде,приложение выводит правильное значение для ключа "tenant_name" в объекте JSON, а в коде сбоя я получаю следующее:
Process finished with exit code 132 (interrupted by signal 4: SIGILL)