嘿,在我的代码中,函数“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")
}
1条答案
按热度按时间czq61nw11#
在
sendRequest
中,每次调用let serialQueue = DispatchQueue(label: "serialQueue", qos: .background)
时都要创建一个新的调度队列。即使所有队列示例具有相同的标签,它们也是不同的队列。您没有展示如何创建包含
sendRequest
的类,所以我不确定这个类是否有一个示例,或者您是否有多个示例。最好避免
.background
QoS;在低功耗情况下,此QoS级别可能会使CPU处于饥饿状态。.utility
是一个很好的选择。假设你有一个示例,你会使用这样的东西:
然后可以在处理程序中使用此队列。