【发布时间】:2023-03-07 09:47:01
【问题描述】:
我尝试使用 DispatchSemaphore 在循环中运行 API 服务,它冻结了应用程序, 我的要求是我已经调用 API 来获取详细信息列表每个详细信息我有不同的请求,我需要在循环中调用 API,每个 API 都依赖于先前 API 的响应,因此我使用了 DispatchSemaphore 等待和信号方法,但它正在释放应用程序
示例代码:
func DownloadInformation(urlString: String, device: String, indexValue: Int, completion: @escaping (_ requestIndex: Int?) -> (Void)) {
ApiService.sharedInstance.DownloadHealthInsightDetails(ID: self.equipmentAnalaysisArr[indexValue].id) { [self] (serverResponse, error, cardID) -> (Void) in
if(serverResponse != nil && error == nil) {
let insightCycleList = serverResponse as? NSDictionary
if (insightCycleList?["error"]) == nil {
if let cycle = insightCycleList?["cycles"] as? [AnyObject], cycle.count != 0 {
let dispatchGroup = DispatchGroup()
let dispatchQueue = DispatchQueue(label: "taskQueue")
let dispatchSemaphore = DispatchSemaphore(value: 0)
for i in 0..<cycle.count {
if i < 5 {
dispatchGroup.enter()
let element = cycle[i]
self.DownloadCycleData(urlString: blob_url , cycleDownloadCompletion: {_ in
completion(indexValue)
dispatchSemaphore.signal()
dispatchGroup.leave()
})
dispatchSemaphore.wait()
}
}
dispatchGroup.notify(queue: DispatchQueue.main) {
print("done")
}
// }
} else {
self.ShowMessage(index: indexValue, message: self.message)
}
}else {
self.ShowMessage(index: indexValue, message: self.message)
}
}
}
}
谁能给我建议来解决这个问题?
谢谢。
【问题讨论】:
-
作为对潜在回答者的礼貌,请发布您的真实代码(它是
Void而不是void)并缩进代码正确。 -
贴出我的原码请查收
-
阻塞执行是信号量的唯一工作,这并不奇怪。有点令人惊讶的是,您使用信号量来序列化所有对
DownloadCycleData的调用。你为什么这样做?与 IO 相关的任务从能够并发运行中受益匪浅。 -
每个响应都依赖于前一个响应,因此我使用信号量
-
或者我们可以通过其他方式实现这一目标吗?