Я пытаюсь быстро вернуть массив из вызова api rest - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь быстро вернуть массив из вызова API Rest

Я получаю обратно данные, но не могу вывести их из области видимости. Проблема как-то связана с asyn c

Когда я перехожу к классу ApiProduct и к методу getProduct; внутри для l oop он работает, и я вижу результаты, но он не вернет массив, который я создаю.

внизу есть переменная с вызовом thisIsTheArrayIWantPopulatedButIsEmpty, и это массив, который я хочу заполнить , но оказывается пустым

Ниже моя площадка

import UIKit

struct APIResponse: Decodable {
    let results: Products
    let status: String
}

struct Products: Decodable {
    let results: [Product]
}

struct Product: Decodable {
    let id: Int64
    let title: String
    let handle: String
    let url: String
}

struct TheProducts {
    let results: [TheProduct]
}

struct TheProduct {
    let id: Int64
    let title: String
    let handle: String
    let url: String
}

class ApiCall {
    let resourceURL: URL

    init(){
        let resourceString = "https://api.xxxxxxxxx.info/v1/Product/GetAllProductsForKeyboard"
        guard let resourceURL = URL(string: resourceString) else {fatalError()}
        self.resourceURL = resourceURL
    }
    
    func getApiData(completion: @escaping (Products?, Error?) -> ()) {
        URLSession.shared.dataTask(with: resourceURL) { data, resp, err in
            DispatchQueue.main.async {
                if let err = err {
                    completion(nil, err)
                    return
                }
                
                //successful
                do {
                    let products = try JSONDecoder().decode(Products.self, from: data!)
                    completion(products, nil)
                }
                catch {
                    completion(nil, err)
                }
            }
        }.resume()
    }
}

class ApiProduct {
    let apiCall = ApiCall()
    
    
    func getProduct() -> [TheProduct]  {
        var list: [TheProduct] = []
        apiCall.getApiData { (products, err) in
            if let err = err {
                print("Failed to fetch products", err)
                return
            }
            products?.results.forEach({ (product) in
                let pro = TheProduct(id: product.id, title: product.title, handle: product.handle, url: product.url)
                list.append(pro)
            })
        }
        return list
    }
}

var api = ApiProduct()
var thisIsTheArrayIWantPopulatedButIsEmpty = api.getProduct()

1 Ответ

0 голосов
/ 14 июля 2020

Вам необходимо изменить метод getProduct, чтобы он также имел блок завершения, как метод getApiData, вместо возврата значения.

class ApiProduct {
    let apiCall = ApiCall()


    func getProduct(completion: @escaping (([TheProduct]) -> Void))  {
        apiCall.getApiData { (products, err) in
            if let err = err {
                print("Failed to fetch products", err)
                return
            }
            var list = [TheProduct]()
            products?.results.forEach({ (product) in
                let pro = TheProduct(id: product.id, title: product.title, handle: product.handle, url: product.url)
                list.append(pro)
            })
            completion(list)
        }
    }
}

var api = ApiProduct()
api.getProduct { list in
    print(list) // here is your list
}
...