我正在尝试通过我的 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)
}
}
在这个闭包中,它在获取所有数据并将其加载到我的 TableView 后打印 "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))
}
})
}
无论是否使用异步
调度,结果都是一样的。
这也影响了我代码的另一部分(更多加载),所以我希望该解决方案能够解决这两个问题。
如有疑问,请提问
最佳答案
主队列是单线程的,因此如果您在主线程中并使用 DispatchQueue.main.async
分派(dispatch)任何其他代码块,它将在您当前的工作完成之前不会运行
我认为你需要确保 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)
}
}
关于swift - 进度条不异步变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51337722/