【问题标题】:DispatchQueue does not update the data in swiftDispatchQueue 不会快速更新数据
【发布时间】:2019-02-03 17:13:37
【问题描述】:

我需要在 Swift 和我使用 UISearchbar 中进行搜索操作。

在 textDidChange 事件中,我需要调用 web api,解析响应,然后更新数组,然后开始搜索更新后的数组。

但不确定我的代码不起作用。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    let group = DispatchGroup()
    group.enter()
    // Perform some asynchronous operation
    let queue1 = DispatchQueue(label: "abc")
    queue1.async {
        self.callWebAPI() // This function calls the web api and parses it’s response
        group.leave()
    }

    DispatchQueue.global(qos: .utility).async {
        DispatchQueue.main.async {
            self.filteredCountry = self.arrCountry.filter({$0.name.prefix(searchText.count) == searchText})
            self.searching = true
            self.tableView.reloadData()
        }
    }
}

func callWebAPI() {
    let urlString = URL(string: "https://restcountries.eu/rest/v2/all")
    if let url = urlString {
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error != nil {
                print(error!)
            } else {
                if let usableData = data {
                    do{
                        //here dataResponse received from a network request
                        let jsonResponse = try JSONSerialization.jsonObject(with:
                            data!, options: [])
                        print(jsonResponse) //Response result

                        guard let jsonArray = jsonResponse as? [[String: Any]] else {
                            return
                        }


                        print(jsonArray)

                        print("done")

                    } catch let parsingError {
                        print("Error", parsingError)
                    }

                }
            }
        }
        task.resume()
    }

}

请指导我上面的代码,因为不确定我错在哪里

【问题讨论】:

    标签: swift asynchronous search nsoperation


    【解决方案1】:

    问题在于callWebAPI 是异步的(它在请求完成之前立即返回),因此您立即调用leave。你可以给这个方法一个完成处理程序并在其中调用leave。您还可以在 notify 块中为您的组调用 UI 更新,而不仅仅是调度它。

    更简单,只需完全停用 DispatchGroup,然后在您提供给 callWebAPI 的完成处理程序中更新您的 UI。

    例如,给callWebAPI 一个完成处理程序:

    func callWebAPI(completionHandler: @escaping ([[String: Any]]?, Error?) -> Void) {
        let urlString = URL(string: "https://restcountries.eu/rest/v2/all")
        if let url = urlString {
            let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
                guard let data = data, error == nil else {
                    completionHandler(nil, error)
                    return
                }
    
                do {
                    let jsonResponse = try JSONSerialization.jsonObject(with:
                        data)
    
                    completionHandler(jsonResponse as? [[String: Any]], nil)
                } catch let parsingError {
                    completionHandler(nil, parsingError)
                }
            }
            task.resume()
        }
    }
    

    然后,您可以消除调度组,全局队列(因为它已经是一个异步方法,您不需要从后台队列中调用它)等等,它被简化为:

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        callWebAPI { jsonResponse, error in
            guard let jsonResponse = jsonResponse, error == nil else {
                print("Error:", error ?? "Response was not correct format")
                return
            }
    
            print(jsonResponse)
    
            // Note, you don’t appear to be using `jsonResponse` at all,
            // so I presume you’d update the relevant model objects.
    
            DispatchQueue.main.async {
                self.filteredCountry = self.arrCountry.filter({$0.name.prefix(searchText.count) == searchText})
                self.searching = true
                self.tableView.reloadData()
            }
        }
    }
    

    顺便说一句,现在我们使用 JSONDecoder 解析 JSON 以直接填充模型对象,但这超出了本问题的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 2018-02-12
      • 2015-11-01
      • 1970-01-01
      • 2023-03-08
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多