Reputation: 11841
I have a method that is making a call to another method that has a completion handler.
func getFilesAndDirectories(folder:String) -> Array<Dictionary<String, String>>
{
var returnedResults = Array<Dictionary<String, String>>()
WebService().GetFilesAndDirectories(folder)
{
(result: Array<Dictionary<String, String>>) in
DispatchQueue.main.async {
returnedResults = result
}
}
return returnedResults
}
Here is how I am calling it:
var filesDirectories = Array<Dictionary<String, String>>()
override func viewDidAppear(_ animated: Bool) {
filesDirectories = getFilesAndDirectories(folder: "/")
print(filesDirectories)
}
But when I print filesDirectories it returns []
My question is, how do I get the results from getFilesAndDirectories to filesDirectories?
Upvotes: 2
Views: 3754
Reputation: 1126
func getFilesAndDirectories(folder:String, completionHandler:@escaping (_ result:Array<Dictionary<String, String>>) -> Void)
{
var returnedResults = Array<Dictionary<String, String>>()
WebService().GetFilesAndDirectories(folder)
{
(result: Array<Dictionary<String, String>>) in
DispatchQueue.main.async {
returnedResults = result
completionHandler(returnedResults)
}
}
}
And you can use the same as follows
var filesDirectories = Array<Dictionary<String, String>>()
override func viewDidAppear(_ animated: Bool) {
getFilesAndDirectories(folder: "/") { result in
self.filesDirectories = result
print(filesDirectories)
}
}
Upvotes: 7
Reputation: 353
You could do some thing like this:
func getFilesAndDirectories(folder: String, completionHandler: @escaping (_ result: Array<Dictionary<String, String>>) -> ()) {
WebService().GetFilesAndDirectories(folder) {
(result: Array<Dictionary<String, String>>) in
completionHandler(result)
}
}
and then:
override func viewDidAppear(_ animated: Bool) {
getFilesAndDirectories(folder: "/", completionHandler: ({
(result) in
print(result)
}))
}
You should have the right value inside the completionHandler scope.
Upvotes: 2