I am confused surrounding the syntax for a completion handler in swift 3.
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)
Two issues:
HistoryKey
instance and has no return value so the signature must be the other way round.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()
}
and call it
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)
}
}
You are not using completion
block.
Use it like:
private func getHistoryKeys(searchterm: String, completion: @escaping (_ keys: Array) -> Void) {
//do the magic
completion(keys)
}
Then you can call this function as:
getHistoryKeys(searchterm: "str") { (keys) in
print("\(keys)")
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With