Попытка анализа данных JSON для вставки другого URL-адреса JSON для анализа дополнительных данных - PullRequest
0 голосов
/ 12 января 2019

Итак, вот ситуация, я пытаюсь проанализировать данные JSON из ссылки 1 и поместить их в URL для анализа данных JSON из ссылки 2. Я создал две структуры для этого. Первая структура - это мой сбор (где мой идентификатор, который я должен использовать для анализа другого JSON во второй ссылке)

struct Collects: Codable {
    let collects: [Collect]
}

struct Collect: Codable {
    let productID: Int

    enum CodingKeys: String, CodingKey {
        case productID = "product_id"
    }
}

моя вторая структура, которая содержит продукты (которые будут проанализированы по второй ссылке

struct Products: Codable {
    let products: [Product]
}

struct Product: Codable {
    let title: String
    enum CodingKeys: String, CodingKey {
        case title
    }
}

Заголовок в структуре Product - это название продукта. В моем контроллере представления у меня есть две следующие функции, которые используются для получения JSON:

func fetchJSON(url: String, completion: @escaping (Collects?, Error?) -> Void) {
    guard let url = URL(string: url) else { return }

let session = URLSession.shared
let dataTask = session.dataTask(with: url) { (data, response, error) in
    if let error = error {
        completion(nil, error)
        print("Unable to fetch data", error)
    }
    guard let data = data else { return }
    do {
        let response = try JSONDecoder().decode(Collects.self, from: data)
        DispatchQueue.main.async {
            completion(response, nil)
        }
    } catch let jsonError{
        print("Unable to decode: ", jsonError)
    }
}
dataTask.resume()
}

и

func fetchProducts(url: String, completion: @escaping (Products?, Error?) -> Void) {
    guard let url = URL(string: url) else { return }

let session = URLSession.shared
let dataTask = session.dataTask(with: url) { (data, response, error) in
    if let error = error {
        completion(nil, error)
        print("Unable to fetch data", error)
    }
    guard let data = data else { return }
    do {
        let response = try JSONDecoder().decode(Products.self, from: data)
        DispatchQueue.main.async {
            completion(response, nil)
        }
    } catch let jsonError{
        print("Unable to decode: ", jsonError)
    }
}
dataTask.resume()
 }

Где первый предназначен для анализа идентификаторов, а второй используется для анализа продуктов. В моем viewDidLoad я использую эту информацию, чтобы получить данные и установить их так, чтобы продукты можно было поместить в представление коллекции.

В моем viewDidLoad у меня есть следующее

let jsonURL = "https://xxxxxxxxxxxxx"


//We need to first fetch the collects
fetchJSON(url: jsonURL) { (response, error) in
    guard let item = response?.collects else { return }
    self.collects = item
    for i in self.collects {
        //This will put all the id's together
        self.collectionCollects.append(",")
        self.collectionCollects.append(String(i.productID))
    }
    //This will remove the first comma in the string
    self.collectionCollects.remove(at: self.collectionCollects.startIndex)

    //This is the productURL that we will use to retrieve the products and put them in the collectionView
    let productURL = "https://xxxxxxxxxxxxx\(self.collectionCollects)&page"

    self.fetchProducts(url: productURL, completion: { (response, error) in
        guard let item = response?.products else {return}
        self.products = item
        self.collectionView.reloadData()
        //The products get printed here
        print(self.products)
    }
  )
}

Чтобы объяснить верхнюю часть, JSONUrl - это первый URL-адрес данных JSON, который передается в функцию для получения информации. В первом цикле for я собираю идентификаторы, помещаю их в строку и разделяю их запятыми, а затем удаляю первую запятую. После этого я вызываю вторую функцию JSON, чтобы использовать новый URL для получения продуктов второго URL. В выражении «print (self.products)» я получаю список ожидаемых продуктов, и даже если я делаю цикл for в self.fetchProducts, чтобы просмотреть и распечатать продукты, я получу ожидаемый результат. Однако, когда я пытаюсь настроить представление моей коллекции с данными, это просто белый экран без информации. Я предполагаю, что проблема заключается в том, как я это настраиваю, а не в конфигурации моей ячейки.

Одна вещь, которую я забыл упомянуть, это то, что в моем контроллере вида у меня есть следующие массивы:

var collects = [Collect]()
var collectionCollects = ""
//This will have the products
var products = [Product]()

Я действительно застрял, я не уверен, что лучше всего сделать все это в одном контроллере представления или разделить его, но это должен быть один просмотр.

1 Ответ

0 голосов
/ 12 января 2019

Ваш вопрос о просмотрах коллекции. Я рекомендую посмотреть здесь . Если при выполнении итерации вы получаете правильный ответ, то проблема заключается в настройке представления коллекции.

...