0

我目前正在使用 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)
    }
}
4

1 回答 1

0

您可以手动计算他们两个是否完成

class YourClass {
    
    var totalRequest = -1
    var requestLoaded = -1
    
    
    func fetchPets() {
        fetchDogs()
        fetchCats()
    }
    
    func fetchDogs() {
        totalRequest += 1
        APICall.getDogsData { (response) in
            self.requestLoaded += 1
            // Do something (transform data) and add dogs to array
            self.checkIfAllRequestLoaded()
        }
    }
    
    func fetchCats() {
        totalRequest += 1
        APICall.getCatsData { (response) in
            self.requestLoaded += 1
            // Do something (transform data) and add cats to array
            self.checkIfAllRequestLoaded()
        }
    }
    
    // Combine both responses once both calls complete
    func checkIfAllRequestLoaded() {
        if requestLoaded == totalRequest {
            // Do something with the stuff
        }
    }
    
}
于 2022-01-04T11:17:32.447 回答