Я использую DispatchGroup для двух запросов URL, но не получил никаких данных. Пробовал каждый метод отдельно без DispatchGroup, работает нормально. Итак, проблема в том, что я неправильно использовал DispatchGroup. Пожалуйста помоги.
let buildingManager = BuildingManager()
let anaManager = AnalyticsManager()
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .background)
queue.async(group: group) {
buildingManager.getBuildingInfos(completion: { [weak self] (buildings, success) in
guard let self = self else {return}
if success {
self.buildings = buildings
print("success")
} else {
print("No building infos")
}
})
}
queue.async(group: group) {
anaManager.getAnaData(completion: {[weak self] (anaData, success) in
guard let self = self else {return}
if success {
self.analyticsData = anaData
print("success")
} else {
print("No analytics data")
}
})
}
group.notify(queue: DispatchQueue.main) { [weak self] in
self?.dataTableView.reloadData()
}
В прошлом у меня была та же проблема, что и у вас, и я немного больше узнал о параллельном процессе в Swift.
Могу ошибаться, но на вашем месте я бы поставил OperationQueue
. Вы можете попробовать сделать это:
let queue = OperationQueue()
queue.addOperation {
buildingManager.getBuildingInfos(completion: { [weak self] (buildings, success) in
guard let self = self else {return}
if success {
self.buildings = buildings
print("success")
} else {
print("No building infos")
}
DispatchQueue.main.async {
self?.dataTableView.reloadData()
}
})
}
queue.addOperation {
anaManager.getAnaData(completion: {[weak self] (anaData, success) in
guard let self = self else {return}
if success {
self.analyticsData = anaData
print("success")
} else {
print("No analytics data")
}
DispatchQueue.main.async {
self?.dataTableView.reloadData()
}
})
}
Ссылка: https://www.raywenderlich.com/5293-operation-and-operationqueue-tutorial-in-swift
Я бы немного рефакторил, чтобы явно входить и выходить из вашей группы по мере необходимости. Использование queue.async(group:)
следует использовать только тогда, когда код в блоке уже не является асинхронным.
let buildingManager = BuildingManager()
let anaManager = AnalyticsManager()
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .background)
queue.async {
group.enter()
buildingManager.getBuildingInfos(completion: { [weak self] (buildings, success) in
defer { group.leave() }
guard let self = self else {return}
if success {
self.buildings = buildings
print("success")
} else {
print("No building infos")
}
})
group.enter()
anaManager.getAnaData(completion: {[weak self] (anaData, success) in
defer { group.leave() }
guard let self = self else {return}
if success {
self.analyticsData = anaData
print("success")
} else {
print("No analytics data")
}
})
group.notify(queue: DispatchQueue.main) { [weak self] in
self?.dataTableView.reloadData()
}
}
Спасибо и за то, что сообщили мне, когда нужно добавить группу в параллельную очередь. Мой код работает хорошо сейчас.