Как связать изображение со значениями из разных URL перед отображением их в ячейке? - PullRequest
0 голосов
/ 04 мая 2019

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