В общем, я решил, что мне еще рано писать Swift
программы.Я хотел портировать свой проект для iOS, написанный на C#
, я решил, что нативное приложение будет лучше, и есть много ловушек с этим закрытием.Но в C#
все проще: просто напишите await
перед функцией, но там это не всегда нужно.
Спасибо всем, кто помог ...
UPD1
Я знаю, что это, вероятно, глупо, но только этот метод работает без лишних проблем с замыканиями.Но повторяющегося кода станет много.
UPD 2
Также, к сожалению, мне пришлось использовать GET
вместо POST
, поскольку в POST
Сервер не получил никаких данных.Я проверил это с echo json_encode($_POST);
.Но я мог бы также не использовать Alamofire
.
UPD 3
Наконец, по совету Тома Харрингтона, мне удалось найти лучшее решение.До того, как я нашел решение , например, , но оно не работает в DispatchQueue.main.async
, например, Alamofire.request
(я предположил, что Alamofire
использует main.async
).Поэтому я сделал как здесь .
UPD 4
И я снова ошибаюсь.Раствор в UPD 3 иногда зависает в теле цикла.И я решил, наконец, научиться использовать собственное завершение, и я сделал это:)
func sendGET(_ method: String,_ data: [String:String],_ instance: CommonClass, completion : @escaping (Any?)->()) {
let url = getURL(method: method, data: data)
Alamofire.request(url, method: .get).responseJSON { response in
if let status = response.response?.statusCode {
instance.manageStatus(status)
}
if let result = response.result.value {
completion(result)
}
}
}
func someFunc(_ instance: CommonClass) {
let data: [String:String] = ["id":String(id),
"route":route]
sendGET("getTaskData.php", data, instance, completion: { response in
let JSON = response as! [[String:String]]
// Do something with JSON
})
}