我目前正在使用 DispatchGroup 在两个 API 调用完成时收到通知,然后将两个响应组合成 1 个对象,然后我在完成处理程序中返回该对象。
这适用于rest api,但是一旦我将它与两个流式调用一起使用,应用程序就会由于连续触发/不均匀的dispatchGroup.leave计数而崩溃。
还有什么方法可以实现我的目标,或者我可以做些什么来继续使用 DispatchGroup?下面是一个简单的例子来展示我在做什么。
func fetchPets(completion: @escaping (Result<[Pet], Error>) -> Void) {
let dispatchGroup = DispatchGroup()
let dogs: [Dog] = []
let cats: [Cat] = []
// Make streaming call 1
dispatchGroup.enter()
fetchDogs(completion: () -> Void) {
// Do something (transform data) and add dogs to array
dispatchGroup.leave()
}
// Make streaming call 2
dispatchGroup.enter()
fetchCats(completion: () -> Void) {
// Do something (transform data) and add cats to array
dispatchGroup.leave()
}
// Combine both responses once both calls complete
dispatchGroup.notify(queue: .main) {
// Do something with the stuff
let pets = Pet(...)
completion(pets)
}
}