Я создал приложение, которое должно заполнять ячейки таблицы текстом и изображениями.Каждая ячейка имеет одну метку и одно изображение.Я использую два запроса на получение alamofire.Первый из них имеет статический URL и содержит свойства json, такие как id, name, imageId, и из этого я использую свойство name для заполнения меток.Второй имеет динамический URL и содержит изображения base64, которые можно преобразовать и использовать для отображения в виде изображения.Сначала я создал массив, в котором я буду хранить все imageId, затем я использую эти значения для зацикливания второго URL, добавляя их в конце.Проблема в том, что я получаю изображения в случайном порядке в таблице.Например: для первой ячейки я получаю текст «Мальчик», но изображение - что-то вроде «Собака» и т. Д. Я извиняюсь за мой английский.
Первый URL-адрес дает json, как это:
[
{
"id": 1,
"name": "Boy",
"imageId": 1
},
{
"id": 2,
"name": "Girl",
"imageId": 2
},
{
"id": 3,
"name": "Dog",
"imageId": 3
}
...
]
Второй URL дает JSON, как это:
{
"id": 1,
"format": "png",
"picture": "iVBORw0KGgoA....
}
А вот код мой:
class TViewController: UITableViewController {
let urlPic = "http://someurl/image/"
let urlDel = "http://someurl/url/rest/"
var resultArray = [Users]()
var nulti = [Nulti]()
let dispatchGroup = DispatchGroup()
let dispatchGroup2 = DispatchGroup()
var array:[String] = []
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = 45
reloading()
}
func getNulti(){
dispatchGroup.enter()
Alamofire.request(urlDel, method: .get)
.responseJSON { (response) in
if response.result.isSuccess {
guard let responseData = response.data else {return}
let jsonDecoder = JSONDecoder()
self.nulti = try! jsonDecoder.decode([Nulti].self, from: responseData)
self.dispatchGroup.leave()
}
else {
print("Error: \(String(describing: response.result.error))")
}
}
}
func reloading(){
getNulti()
dispatchGroup.notify(queue: .main){
for res in self.nulti{
print(res)
let idd = res.imageId?.description
self.getPicture(idd: idd!)
print("aa")
}
}
}
func getPicture(idd : String) {
dispatchGroup2.enter()
let urll = urlPic + idd
print(urll)
let url = URL(string: urll)
Alamofire.request(url!, method: .get).responseJSON { (response) in
if let responseObj = response.value {
do {
let decodedData = try JSONDecoder().decode(Users.self, from: response.data!)
self.resultArray.append(decodedData)
print("added")
self.dispatchGroup2.leave()
print("leave")
self.dispatchGroup2.notify(queue: .main){
self.tableView.reloadData()
print("done reload")
}
} catch {
}
}
else {
print("nothing")
}
}
}
func picConvertor(id : String) -> UIImage{
let dataDecoded : Data = Data(base64Encoded: id, options: .ignoreUnknownCharacters)!
let decodedimage = UIImage(data: dataDecoded)
return decodedimage!
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return resultArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TViewCell
cell.namelbl?.text = nulti[indexPath.row].name
let picById = self.resultArray.reversed()[indexPath.row].picture!
cell.picPerson?.image = picConvertor(id: picById)
print("done")
return cell
}
}
И 2 структуры
import Foundation
struct Users: Codable {
let id: Int?
let format: String?
let picture: String?
enum CodingKeys: String, CodingKey {
case id
case format
case picture
}
}
import Foundation
struct Nulti: Codable {
var id: Int?
var name: String?
var imageId: Int?
enum CodingKeys: String, CodingKey {
case id, name, imageId
}
}