This is my working code to fetch one item from NASA API I used the completion handler as presented on Apple Programming book.
class PhotoInfoController {
    func fetchPhotoInfo(completion: @escaping (PhotoInfo?) -> Void) {
        let baseURL = URL(string: "https://api.nasa.gov/planetary/apod")!
    let query: [String:String] = [
        "api_key" : "DEMO_KEY"
    ]
    let url = baseURL.withQueries(query)!
    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        let jsonDecoder = JSONDecoder()
        if let data = data,
           let photoInfo = try? jsonDecoder.decode(PhotoInfo.self, from: data) {
            completion(photoInfo)
        } else {
            print("Not found or data is not sanitazed.")
            completion(nil)
        }
    }
    task.resume()
   }
}
The problem I having a hard time to figuring it out is how you can return an array go items (PhotoInfo) via a completion handler. This is my code so far:
class PhotoInfoController {
    func fetchPhotoInfo(completion: @escaping ([PhotoInfo]?) -> Void) {
        let baseURL = URL(string: "https://api.nasa.gov/planetary/apod")!
    let currentDate = Date()
    let formatter = DateFormatter()
    formatter.dateFormat = "YYYY-MM-d"
    var photoInfoCollection: [PhotoInfo] = []
    
    for i in 0 ... 1 {
        let modifiedDate = Calendar.current.date(byAdding: .day,value: -i ,to: currentDate)!
        let stringDate = formatter.string(from: modifiedDate)
        let query: [String:String] = [
            "api_key" : "DEMO_KEY",
            "date" : stringDate
        ]
        
        let url = baseURL.withQueries(query)!
        let task = URLSession.shared.dataTask(with: url) { (data,
                                                            response,
                                                            error) in
            let jsonDecoder = JSONDecoder()
            
            if let data = data,
               let photoInfo = try? jsonDecoder.decode(PhotoInfo.self, from: data) {
                photoInfoCollection.append(photoInfo)
            } else {
                print("Data was not returned")
            }
        }
        task.resume()
    }
    
    
    completion(photoInfoCollection)
    }
}
Any ideas or guide will greatly appreciated Thanks!
Code Implemented after suggestions:
class PhotoInfoController {
    private let baseURL = URL(string: "https://api.nasa.gov/planetary/apod")!
    private let currentDate = Date()
    private let dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "YYYY-MM-d"
        return formatter
    }()
    
    private let jsonDecoder = JSONDecoder()
    
    func fethPhotoInfo(itemsToFetch: Int, completion: @escaping ([PhotoInfo]?) -> Void) {
        var count = 0
        var photoInfoCollection: [PhotoInfo] = []
        
        for i in 0 ... itemsToFetch {
            let modifiedDate = Calendar.current.date(byAdding: .day, value: -i, to: currentDate)!
            
            let query: [String : String] = [
                "api_key" : "DEMO_KEY",
                "date" : dateFormatter.string(from: modifiedDate)
            ]
            
            let url = baseURL.withQueries(query)!
            let task = URLSession.shared.dataTask(with: url) {
                (data, response, error) in
                
                if let data = data,
                   let photoInfo = try? self.jsonDecoder.decode(PhotoInfo.self, from: data) {
                    photoInfoCollection.append(photoInfo)
                    count += 1
                    
                    if count == itemsToFetch {
                        completion(photoInfoCollection)
                    }
                    
                } else {
                    print("Data for \(self.dateFormatter.string(from: modifiedDate)) not made.")
                }
            }
            task.resume()
        }
    }
}
 
     
    