完成处理程序Swift 3从函数返回变量 [英] Completion handler swift 3 return a variable from function

查看:140
本文介绍了完成处理程序Swift 3从函数返回变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Swift 3中的完成处理程序的语法感到困惑.

I am confused surrounding the syntax for a completion handler in swift 3.

在下面的函数中,从Web服务调用中解析xml文件后,它应返回一个变量(一个array [String:String]).
我的尝试在下面,但显然是不正确的.

In the function below, after parsing an xml file from a web service call, it should return a variable (an array [String:String]).
My attempt is below, but obviously it is incorrect.

  enum HistoryKey {
  case success([String:String])
  case failure(String)
 }

 private func getHistoryKeys(searchterm: String, completion: @escaping () -> HistoryKey) {
    let url = PubmedAPI.createEsearchURL(searchString: searchterm)
    let request = URLRequest.init(url: url as URL)
    let task = session.dataTask(with: request) { (data, response, error) in

        if let theData = data{
            let myParser = XMLParser.init(data: theData)
            myParser.delegate = self
            myParser.parse()
        }
    }
    task.resume()

    if keys.isEmpty {
        return .failure("no historyKeyDictionary")
    }else{
        return .success(keys)
    }

}// End of func

我要按以下方式使用此功能

I want to use this function as follows

 let result = self.getHistoryKeys(searchTerm)

推荐答案

两个问题:

  • 完成处理程序传递一个HistoryKey实例,并且没有返回值,因此签名必须相反.
  • 完成处理程序的调用必须在数据任务的完成块内内部.
  • The completion handler passes a HistoryKey instance and has no return value so the signature must be the other way round.
  • The call of the completion handler must be inside the completion block of the data task.

为了能够在完成块之外解析接收到的数据,请在成功后返回data

To be able to parse the received data outside the completion block return the data on success

enum ConnectionResult {
   case success(Data)
   case failure(Error)
}

private func getHistoryKeys(searchterm: String, completion: @escaping (ConnectionResult) -> ()) {
   let url = PubmedAPI.createEsearchURL(searchString: searchterm)
   let task = session.dataTask(with: url) { (data, response, error) in
       if let error = error {
          completion(.failure(error))
       } else {
          completion(.success(data!))
       }
  }
  task.resume()
}

并命名为

getHistoryKeys(searchterm: String) { connectionResult in 
    switch connectionResult {
       case .success(let data): 
           let myParser = XMLParser(data: data)
           myParser.delegate = self
           myParser.parse()
           // get the parsed data from the delegate methods

       case .failure(let error): print(error)
    }
}

这篇关于完成处理程序Swift 3从函数返回变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆