我正在使用以下代码将数据与我的服务器同步。完成任务后,我想调用以下内容:
self.refreshControl?.endRefreshing()
然而,我希望确保它发生在该方法内任何可能发生的事情之后。这时候应该使用完成处理程序吗?这让我很困惑,因为我已经运行了在收到http响应后执行的代码。如果我添加一个完成处理程序,它会在收到http响应后执行吗?并且我是否可以在那里放置我的endRefreshing()代码,以便在下面的代码中发生任何事情之后执行?谢谢!
func syncCustomers(token: String) {
let url:NSURL = NSURL(string: Constants.Api.BaseUrl + "api/customer")!
let session = URLSession.shared
let request = NSMutableURLRequest(url: url as URL)
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
request.httpMethod = "GET"
let task = session.dataTask(with: request as URLRequest) { (data, response, error) in
guard let data = data else { return }
do {
if error != nil {
self.showAlert(title: "Error", message: error!.localizedDescription)
}
else if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode == 200 {
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? Array<Any>
DispatchQueue.global().async {
for item in json! {
if let customer = Customer(json: item as! [String : Any]) {
_ = SqliteDB.instance.replaceCustomer(customer: customer)
}
}
self.customers = SqliteDB.instance.getCustomers()
self.tableView.reloadData()
}
} else if httpResponse.statusCode == 401 {
self.showAlert(title: "Error", message: "Unauthorized. Please try logging in again.")
}
}
} catch let error as NSError {
self.showAlert(title: "Error", message: error.localizedDescription)
}
}
task.resume()
}
myAsyncFunction
中声明一个defer
块:从文档中可以看到,'使用 defer 编写一段代码块,在函数中的所有其他代码执行完毕之后执行。在函数返回之前执行该代码块。无论函数是否抛出错误,该代码都会被执行。' 因此,您只需调用一次完成方法即可。 - Nicolas Buquetdefer
会等到完成块执行完毕后再执行吗?此外,我相信这个延迟代码将在函数返回后执行。 - Fogmeistercompletion()
。就这些了。 - Nicolas Buquet