user979331
user979331

Reputation: 11841

Swift 4 Get results in completion handler

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

Answers (2)

Sucharu Hasija
Sucharu Hasija

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

bubu
bubu

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

Related Questions