我正尝试通过Spotify请求异步更改进度条的进度。我怎样才能做到这一点呢?
到目前为止我所拥有的:
searchClosure { result in
switch result {
case .success(let request):
print("GOT")
print("0.5")
DispatchQueue.main.async { // No affect when I add this async
self.userDelegate?.songProgress.setProgress(0.5, animated: true)
print("loaded 0.5")
}
self.currentRequest = request
self.getSongs(searchTerm: searchTerm)
case .failure(_):
self.getAccessToken()
self.search(searchTermInput)
}
}
在此闭包中,在提取所有数据并将其加载到我的表视图中后,它将打印"loaded 0.5"
,但我只希望在请求成功并到达代码中的那一行后立即对其进行更改。但是,"0.5"
会在我的代码到达该点时立即打印。
为什么这不能正常工作?您还可以按照自己的意愿,看到我正在为我的UI
使用主线程。
Alamofire 请求(转到Spotify):
func searchClosure(completion: @escaping (RequestResult) -> ()) {
Alamofire.request(searchTermURL, method: .get, headers: headers).responseJSON(completionHandler: { response in
// Check if response is valid
if let searchRequest = response.result.value as? JSONStandard {
completion(.success(searchRequest))
} else {
completion(.failure(SpotifyError.failedToGetSearchResults))
}
})
}
无论是否进行asynchronous
调度,结果都是相同的。
这也影响了我代码的另一部分(增加了负载),所以我希望该解决方案能够同时解决这两个问题。
如有任何疑问,请询问
答案 0 :(得分:0)
主队列是单线程的,因此如果您在主线程中并使用DispatchQueue.main.async
调度了其他代码块,它将在您当前的工作完成之前不运行
我认为您需要确保searchClosure
的回调是从另一个线程而不是主线程运行的,并且仅将使用UI的内容包含在主线程中
简单快速的解决方案就像
searchClosure { result in
DispatchQueue.global(qos: .background).async {
switch result {
case .success(let request):
print("GOT")
print("0.5")
DispatchQueue.main.async {
self.userDelegate?.songProgress.setProgress(0.5, animated: true)
print("loaded 0.5")
}
self.currentRequest = request
self.getSongs(searchTerm: searchTerm)
case .failure(_):
self.getAccessToken()
self.search(searchTermInput)
}
}