进度栏不会异步更改

时间:2018-07-14 10:48:26

标签: 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)
    }
}

在此闭包中,在提取所有数据并将其加载到我的表视图中后,它将打印"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调度,结果都是相同的。

这也影响了我代码的另一部分(增加了负载),所以我希望该解决方案能够同时解决这两个问题。


如有任何疑问,请询问

1 个答案:

答案 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)
        }
    }