快速和多线程的完成处理程序

时间:2018-08-17 23:59:17

标签: multithreading api swift4 grand-central-dispatch completionhandler

代码的目的:

代码正在调用第三方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
}

我尝试过/知道的事情:

    如果未通过dispatchGroup进行同步,则APIClass中的
  1. getData函数可以正常工作。

  2. 代码将执行直到到达group.wait()。随后冻结(等待group.leave())。永远不会调用getData的完成处理程序!

  3. 当我打印当前线程名称并通过一些调试时,我看到以下内容:(线程号由组成)

    • score_calculator在线程#11上。
    • APIinstance.getData(data:datapoint)在线程#14上启动
    • getData的完成处理程序在线程#11上运行。

      即score_calculator和完成处理程序在同一线程上运行。我不知道为什么或如何更改此设置。但这与我们的观察结果一致,即如果将group.wait()添加到线程#11,则完成处理程序将永远不会得到服务。

0 个答案:

没有答案