Idris Ocasio
Idris Ocasio

Reputation: 25

Method call asks for method as parameter

I'm pretty new to swift so this might be a really simple question, but I am trying to create a method that returns a list upon completion but when I try to call the method, it says I am missing the escaping parameter which I do not know how to satisfy.

Here is the method:

func fillFromFile(completionBlock: @escaping ([Asset_Content]) -> ()) {
    let url = "URL STRING"

    LoadJSONFile(from: url) { (result) in
        // The code inside this block would be called when LoadJSONFile is completed. this could happen very quickly, or could take a long time

        //.map is an easier way to transform/iterate over an array
        var newContentArray = [Asset_Content]()
        for json in result{
            let category = json["BIGCATEGORY"] as? String
            let diagnosis = json["DIAGNOSIS"] as? String
            let perspective = json["PERSPECTIVE"] as? String
            let name = json["NAME"] as? String
            let title = json["Title"] as? String
            let UnparsedTags = json["TAGS"] as? String
            let filename = json["FILENAME"] as? String

            let tagArray = UnparsedTags?.characters.split(separator: ",")
            for tag in tagArray!{
                if(!self.ListOfTags.contains(String(tag))){
                    self.ListOfTags.append(String(tag))
                }
            }

            let asset = Asset_Content(category!, diagnosis!, perspective!, name!, title!, filename!)
            // This is a return to the map closure. We are still in the LoadJSONFile completion block
            newContentArray.append(asset)

        }
        print("return count ", newContentArray.count)
        // This is the point at which the passed completion block is called. 
        completionBlock(newContentArray)
    }
}

here is the method call:

self.ListOfFiles = fillFromFile()

and the error is "Missing argument for parameter 'completionblock' in call"

Upvotes: 0

Views: 47

Answers (2)

Alexander
Alexander

Reputation: 63397

Notice that the fillFromFile function doesn't return anything. It's an asynchronous function. This means that it does its work independently of the main control flow of the thread it was called from. It'll return (nothing) almost immediately, and perform its work some unknown time thereafter.

To obtain the result of this function, you're expected to given a completion handler. This is a closure that will be called by the code when it eventually completes its work. As a parameter to this closure, it will pass in the result of the work (an Array<Asset_Content>).

Here's simple example of how to satisfy this method signature:

fillFromFile { (response) in
    print(response)
}

I suggest you read the language guide, especially its section on closures.

Upvotes: 0

Edu
Edu

Reputation: 402

The way you expect the response of a method with completionBlock is like this:

    fillFromFile { (response) in
        self.ListOfFiles = response
    }

Like this you are setting your ´ListOfFiles´ variable, with the new variable that comes in the method.

In the return of your function you should have a DispatchQueue

DispatchQueue.main.async {
     completionBlock(newContentArray)
}

Upvotes: 2

Related Questions