iosjsonswiftparsing

Why will the object not append to the array?


class NetworkManager{
    var articleList = [Article]()

    func downloadJsonData() -> Void{
        let jsonUrl = "someUrl"

        guard let url = URL(string: jsonUrl) else { return }

        URLSession.shared.dataTask(with: url) { data, response, err in
            //check err
            //check response status
            guard let data = data else { return }

            do{
                let apiResults = try JSONDecoder().decode(ApiResults.self, from: data)
                //article list remains empty
                self.articleList = apiResults.articles
            } catch let err{
                print(err)
            }
        }.resume()
    }
}

I have also tried to use a for loop to append to the array and that didn't work either. Any help will be appreciated.


Solution

  • First thing I would check is that the data returned is correct.

    Is the guard block triggering the return or is the data fine?

    Is the JSON able to decode the response correctly?

    Are the articles in the apiResults object populated.

    The next thing is you are not attempting to append the contents of apiResults.articles to your list, instead you are making your list become what ever apiResults.articles is.

    Try the following and see how it runs:

    class NetworkManager{
    
        // better declaration syntax
        var articleList: [Article] = []
    
        func downloadJsonData() {
            let jsonUrl = "https://newsapi.org/v2/everything?sources=nfl-news&apiKey=mykey"
    
            guard let url = URL(string: jsonUrl) else { return }
    
            URLSession.shared.dataTask(with: url) { data, response, err in
                //check err
                //check response status
                guard let data = data else { return }
    
                do{
                    let apiResults = try JSONDecoder().decode(ApiResults.self, from: data)
                    //article list remains empty
                    //appends contents instead of assignment
                    self.articleList.append(contentsOf: apiResults.articles)
                } catch let err{
                    print(err)
                }
            }.resume()
        }
    }