代码的目的:
代码正在调用第三方API,以获取“主线程”上的某些数据。 API请求是异步的-意味着它将在不确定的时间后返回。我需要主线程等待数据返回,然后再进行进一步的计算
问题: 使用-dispatchGroup wait()等待API请求被处理时->它冻结执行,并且永远不会调用API完成处理程序。
class ScoreCalc {
func score_calculator(values:[Int]){
let APIinstance = APIclass()
APIinstance.delegate = self
for datapoint in values{
// Start Background thread
let group = DispatchGroup()
group.enter()
print("Entering Thread:")
DispatchQueue.global(qos: .userInteractive).async {
print("Background Thread:")
APIinstance.getData(data: datapoint)
group.leave()
}
group.wait()
// Run further computations on data
//
}
}
func delegateReturn(data: APIclass.FlowData) {
self.flowData = data
self.dispatchGroup.leave()
}
}
API处理程序类和代码:
class APIclass {
var delegate: ScoreCalc?
func getData(data: datapoint) {
let API_request_CMD: String = "some url text with datapoint in it"
let request = URLRequest(url: URL(string: API_request_CMD)!)
let session = URLSession.shared
session.dataTask(with: request) {data, response, err in
print("Entered the completionHandler")
if response != nil {
// print response code
}
if data != nil {
do {
let myStruct = try JSONDecoder().decode(HereJSON.self, from: data!) // Decoding our data
let flowData = doStuffWithJson(input: myStruct)
self.delegate?.delegateReturn(data: flowData)
} catch {
print("Error in API class")
}
}
}.resume()
}
return
}
我尝试过/知道的事情:
getData函数可以正常工作。
代码将执行直到到达group.wait()。随后冻结(等待group.leave())。永远不会调用getData的完成处理程序!
当我打印当前线程名称并通过一些调试时,我看到以下内容:(线程号由组成)
getData的完成处理程序在线程#11上运行。
即score_calculator和完成处理程序在同一线程上运行。我不知道为什么或如何更改此设置。但这与我们的观察结果一致,即如果将group.wait()添加到线程#11,则完成处理程序将永远不会得到服务。