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

swift3 – Swift 3.0中的完成处理程序,第1张

概述我使用下面的代码与我的服务器同步数据.完成任务后,我想打电话给: self.refreshControl?.endRefreshing() 但是,我想确保它发生在此方法中可能发生的任何事情之后.这是我使用完成处理程序的地方吗?这让我感到困惑,因为我已经运行了在获得http响应后执行的代码.如果我添加一个完成处理程序,它会在收到http响应后执行吗?我可以将我的endRefreshing()代码放在 我使用下面的代码与我的服务器同步数据.完成任务后,我想打电话给:
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()    }}
总结

以上是内存溢出为你收集整理的swift3 – Swift 3.0中的完成处理程序全部内容,希望文章能够帮你解决swift3 – Swift 3.0中的完成处理程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1049503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存