Итак, вот ситуация, я пытаюсь проанализировать данные 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]()
Я действительно застрял, я не уверен, что лучше всего сделать все это в одном контроллере представления или разделить его, но это должен быть один просмотр.