Функция Swift выдает «SIGILL» в операторе возврата - PullRequest
0 голосов
/ 05 июня 2019

Я пишу кусок кода в 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)
...