swift3 – Swift 3.0中的完成处理程序

我使用下面的代码与我的服务器同步数据.完成任务后,我想打电话给:
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()
}
完成或闭包只是一个包含在参数中的函数……

你可以用这样的闭包来创建一个函数……

func doSomethingAsync(completion: () -> ()) {
}

参数完成的类型为() – > ()那是……它是一个函数 – >不接受输入参数()并返回void().

你也可以做一个像…的功能

// (inputs) -> (outputs)
(String) -> ()

或者您想要的任何输入或输出.

现在,就像你的问题一样.此函数可能会调用其他一些异步函数

func myAsyncFunction(completion: () -> ()) {

    someOtherAsyncFunction() {

        // This is the completion of "someOtherAsyncFunction"

        // Call YOUR completion here...
        completion()
    }

}

为了确保在完成其他异步方法之后调用完成,请将其置于另一个方法的完成之内.像上面一样.

现在,打电话给你,你可以做…

self.myAsyncFunction() {
    // your completion block code here.
}

现在,在其他异步方法完成后,将调用完成块代码.

当然,如果你在另一个完成中有多个路径(比如错误等等),那么你必须在每个端点调用你的完成…

func myAsyncFunction(completion: () -> ()) {

    someOtherAsyncFunctionWithAPossibleError() {
        error in

        if error != nil {
            completion()
            // this return means the other completion won't be run
            return
        }

        completion()
    }

}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...