ios - 完成处理程序 swift 3 从函数返回一个变量

标签 ios swift swift3 completionhandler

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

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

  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

我想按如下方式使用这个函数

 let result = self.getHistoryKeys(searchTerm)

最佳答案

两个问题:

  • 完成处理程序传递一个 HistoryKey 实例并且没有返回值,因此签名必须相反。
  • 完成处理程序的调用必须在数据任务的完成 block 内部

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

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)
    }
}

关于ios - 完成处理程序 swift 3 从函数返回一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44131678/

相关文章:

iphone - 将多个 UIImages 插入到 "container"

java - 如何为 iOS 推送通知传递 JSON 对象

ios - 文件不会写入磁盘。我究竟做错了什么?

ios - 如何在 Swift 中打印 Unicode 字符

ios - PKPass 错误 "The pass cannot be read because it isn’ t 有效。”

ios - -[NSString dataUsingEncoding :] gives garbage at end of string in iOS 9, 不是 iOS 8

swift 4 : Sorting data with Firestore

swift - 如何使用Swift查找免费的本地端口?

ios - Core Data 自定义策略的选择器语法是什么?

iOS 7 应用程序加载 View Flash 出现之前