Swift serial DispatchQueue未串行执行

uqcuzwp8  于 2023-05-16  发布在  Swift
关注(0)|答案(1)|浏览(149)

嘿,在我的代码中,函数“sendRequest”被多次调用,它向服务器发送请求。服务器一个接一个地处理所有请求,并发回多个响应。现在我想在函数“handleResponse”中处理这些响应,但是在一个串行队列中。所以handleResponse在同一时间只会被调用一次。但是现在我的日志看起来像这样:

[15.05.2023 11:28:00.711] DEBUG NetworkDataHandler:52 - start handleResponse
[15.05.2023 11:28:00.710] DEBUG NetworkDataHandler:52 - start handleResponse
[15.05.2023 11:28:00.713] DEBUG NetworkDataHandler:52 - start handleResponse
[15.05.2023 11:28:00.713] DEBUG NetworkDataHandler:52 - start handleResponse
[15.05.2023 11:28:00.714] DEBUG NetworkDataHandler:52 - start handleResponse
...

handleResponse因此被调用了几次,尽管它还没有完成。我怎样才能让回调函数连续工作?
简化代码:

func sendRequest() { // is called several times
    applicationNetworkManager().sendQuery(
        ...
        successHandler: { response in
 
            let workItem = DispatchWorkItem {
                self!.handleResponse(response: response)
            }
            let serialQueue = DispatchQueue(label: "serialQueue", qos: .background)
            serialQueue.async(execute: workItem)
        }
    )
}

func handleResponse(response: Response) {
    Logger.d("start handleResponse")

    // do some stuff and write response data to local storage

    DispatchQueue.main.async {
        // update ui
    }

    Logger.d("end handleResponse")
}
czq61nw1

czq61nw11#

sendRequest中,每次调用let serialQueue = DispatchQueue(label: "serialQueue", qos: .background)时都要创建一个新的调度队列。即使所有队列示例具有相同的标签,它们也是不同的队列。
您没有展示如何创建包含sendRequest的类,所以我不确定这个类是否有一个示例,或者您是否有多个示例。
最好避免.background QoS;在低功耗情况下,此QoS级别可能会使CPU处于饥饿状态。.utility是一个很好的选择。
假设你有一个示例,你会使用这样的东西:

class NetworkHandler {

    let myQueue: DispatchQueue

    init() {
        self.myQueue = DispatchQueue(label:"serialQueue", qos: .utility)
    }
}

然后可以在处理程序中使用此队列。

相关问题