В настоящее время я тестирую этот код на игровой площадке Xcode 10 (Swift 5):
func one() {
let test = "bla"
two(test, completion: { (returned) in
print(returned)
})
}
func two(_ test: String, completion: @escaping (_ returned: String?) -> Void) {
DispatchQueue.global(qos:.background).async {
if !test.isEmpty {
//Some slow stuff
DispatchQueue.main.async {
return completion("hi!")
}
}
//Also some slow stuff
DispatchQueue.main.async {
return completion(nil) //can't have this in "else"!
}
}
}
one()
Проблема в том, что печатаются и "привет", и "ноль".
Если я избавлюсь от многопоточности, он будет работать нормально, но с ним кажется, что он доберется до второго DispatchQueue.main.async
до того, как у первого появится шанс вернуться.
В «Некоторые медленные вещи» if
в моем реальном коде происходит гораздо больше вещей, но я не могу полагаться на то, что это займет достаточно много времени, чтобы вернуться до того, как будет вызван второй возврат.
Как мне это сделать: заставить функцию работать в фоновом потоке, но возвращать ее только один раз в основном потоке (как обычно делает код без потоков)?
if
и медленные вещи внутри, а затем вызвать обработчик завершения, чтобы вернуть результат обратно вone()
. Еслиif
не срабатывает, я хочу только вызвать также некоторые медленные вещи и вернутьnil
. - person Neph   schedule 23.07.2019else
. - person vacawama   schedule 23.07.2019else
, но в моем реальном приложении это в основном длинный списокif
с единственным хорошим результатом. Конечно, я мог бы просто вернуться в каждомelse
, но мне также нужно сделать некоторые другие вещи, прежде чем я это сделаю (например, закрыть сокеты), и тогда тот же код будет там примерно. 10 раз. - person Neph   schedule 23.07.2019