swift - 进度条不异步变化

标签 swift asynchronous uisearchbar

我正在尝试通过我的 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/

相关文章:

swift - 使用 Codable 序列化包含引用循环的自定义类

swift - 缺少带有默认参数的声明

c++ - 无堆栈 C++20 协程有问题吗?

ios - 如何取消在后台运行的线程? (iOS)

ios - 在搜索栏中输入第二个字母后 TableView 不显示任何内容

ios - Xcode 7 Swift 2 对象大小在运行时不同

hash - 在 Swift 中编写一个好的 Hashable 实现

javascript - 忽略旧的多个异步 ajax 请求

ios - 如何在单击“取消”按钮时退出搜索?

uitableview - UISearchDisplayController 中的 searchResultsTitle 不起作用