0

API呼び出しを行い、データをそのプロパティに保存するサービスクラスがあります。次に、インタラクター クラスには、サービス クラスの API 呼び出しを行うメソッドがあり、データが格納されるときにそれを返します。私は完了ハンドラーとディスパッチグループでこれを処理しようとしましたが、(何かが足りないと思います) これはうまくいきませんでした。この問題に対処するために私を助けていただければ幸いです。前もって感謝します!

サービス クラス:

class PunkApiService{

var beers = [Beer]()

func loadList(at page: Int){
    //MARK: - Checks is URL is valid + pagination
    guard let url = URL(string: "https://api.punkapi.com/v2/beers?page=\(page)&per_page=25") else {
        print("Invalid URL")
        return
    }
    //MARK: - Creating URLSession DataTask
    let task = URLSession.shared.dataTask(with: url){ data, response, error in
        //MARK: - Handling no erros came
        guard error == nil else {
            print(error!)
            return
        }
        //MARK: - Handling data came
        guard let data = data else{
            print("Failed to load data")
            return
        }
        do{
            let beers = try JSONDecoder().decode([Beer].self, from: data)
            self.beers.append(contentsOf: beers)
        }
        catch{
            print("Failed to decode data")
        }
    }
    task.resume()
}

および Interactor クラス (完了ハンドラーまたはディスパッチ グループなし):

class BeersListInteractor:BeersListInteractorProtocol{
private var favoriteBeers = FavoriteBeers()
private var service  = PunkApiService()
//MARK: - Load list of Beers
func loadList(at page: Int) -> [Beer]{
    service.loadList(at: page)
    return service.beers
}

追加:完了ハンドラでの私の試み

    var beers: [Beer]                                          
func loadList(at page: Int, completion: ()->()){
    service.loadList(at: page)
    completion()
    
}

func completion(){
    beers.append(contentsOf: service.beers)
}

loadList(at: 1) {
    completion()
}
4

2 に答える 2