У меня есть a, b, c, d, e трудоемкие задачи с обработчиком завершения.
Между ними есть ограничения:
- Оба b & c ожидание a до конца
- Последнее задание e ожидает b & c & d до финиша
если задачи нет d , я мог бы написать код на swift, как это (еще не проверено)
let group = DispatchGroup()
group.enter()
a() { group.leave() }
group.wait()
group.enter()
b() { group.leave() }
group.enter()
c() { group.leave() }
group.notify(queue: .main) {
e()
}
Как добавить задачу d без ожидания a для завершения?
Отредактировано 4/30 10:00 (+8)
Код Различный сказал
самый простой подходсделать функцию загрузки синхронной и добавить предупреждение в документацию о том, что ее нельзя вызывать из основного потока.
Поэтому я сделал версию на ее основе.Этот способ не может обработать возвращаемые значения от одновременных вызовов.Но это действительно похоже на асинхронное ожидание.Так что я доволен сейчас.Спасибо вам, ребята.
асинхронная / ожидающая часть похожа на
myQueue.async {
downloadSync("A")
downloadSync("B", isConcurrent: true)
downloadSync("C", isConcurrent: true)
downloadSync("D", 4, isConcurrent: true)
waitConcurrentJobs()
downloadSync("E")
}
А полный код приведен ниже.
let myGroup = DispatchGroup()
let myQueue = DispatchQueue(label: "for Sync/Blocking version of async functions")
func waitConcurrentJobs() {
myGroup.wait()
}
// original function (async version, no source code)
func download(_ something: String, _ seconds: UInt32 = 1, completionHandler: @escaping ()->Void = {}) {
print("Downloading \(something)")
DispatchQueue.global().async {
sleep(seconds)
print("\(something) is downloaded")
completionHandler()
}
}
// wrapped function (synced version)
// Warning:
// It blocks current thead !!!
// Do not call it on main thread
func downloadSync(
_ something: String,
_ seconds: UInt32 = 1,
isConcurrent: Bool = false
){
myGroup.enter()
download(something, seconds) { myGroup.leave() }
if !isConcurrent {
myGroup.wait()
}
}
// Now it really looks like ES8 async/await
myQueue.async {
downloadSync("A")
downloadSync("B", isConcurrent: true)
downloadSync("C", isConcurrent: true)
downloadSync("D", 4, isConcurrent: true)
waitConcurrentJobs()
downloadSync("E")
}
результаты