繁体   English   中英

将 DispatchGroup 与流式 API 一起使用?

[英]Using DispatchGroup with Streaming API?

我目前正在使用 DispatchGroup 在两个 API 调用完成时收到通知,然后将两个响应组合成 1 个 object,然后我在完成处理程序中返回。

这适用于 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)
    }
}

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

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
        }
    }
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM