我应该如何将 DispatchGroup 用于两个 url 请求?
How should I use DispatchGroup for two url requests?
我正在使用 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()
}
}
我正在使用 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()
}
}