进度条不异步变化
Progress bar not changing asynchronously
我正在尝试通过我的 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)
}
}
在这个闭包中,它在获取所有数据并将其加载到我的 table 视图后打印 "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
分派,结果都是一样的。
这也影响了我代码的另一部分(更多加载),所以我希望该解决方案能解决这两个问题。
如有问题请提问
主队列是单线程的,因此如果您在主线程中并使用 DispatchQueue.main.async
分派任何其他代码块,它不会 运行 直到您当前的工作完成
我认为你需要确保 searchClosure
的回调是 运行ning 来自另一个线程而不是主线程,并且只包含在 Main 中使用 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)
}
}
我正在尝试通过我的 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)
}
}
在这个闭包中,它在获取所有数据并将其加载到我的 table 视图后打印 "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
分派,结果都是一样的。
这也影响了我代码的另一部分(更多加载),所以我希望该解决方案能解决这两个问题。
如有问题请提问
主队列是单线程的,因此如果您在主线程中并使用 DispatchQueue.main.async
分派任何其他代码块,它不会 运行 直到您当前的工作完成
我认为你需要确保 searchClosure
的回调是 运行ning 来自另一个线程而不是主线程,并且只包含在 Main 中使用 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)
}
}