Почему в результате я получаю два пустых значения подряд? - PullRequest
0 голосов
/ 20 апреля 2019

Я хотел бы загрузить изображение из API в UIImageView внутри ячейки. Но так как я сначала получаю nill-значения два раза подряд, я не могу этого сделать. Вот мой код:

class MainController: UITableViewController{

    var nulti = [Nulti]()
    var picture = Picture()
    let urlDel = "http://xx"
    let urlPic = "http://xxx/"

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.rowHeight = 44
        getNulti()
    }

    func getNulti(){
        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)
                    for pic in self.nulti{
                        let id = pic.image 
                        if(id != nil){
                            self.getPicture(id: id!.description)
                        }
                    }
                    self.tableView.reloadData()
                }
                else {
                    print("Error: \(String(describing: response.result.error))")
                }
           }
    }

    func getPicture(id: String){
        Alamofire.request(urlPic + id, method: .get)
            .responseJSON { response in
                if response.result.isSuccess {
                    guard let responseData = response.data else {return}
                    let jsonDecoder = JSONDecoder()
                    self.picture = try! jsonDecoder.decode(Picture.self, from: responseData)
                    self.tableView.reloadData()
                } else {
                    print("Error: \(String(describing: response.result.error))")
                }
           }
    }

    func picConvertor(id : String) -> UIImage{
        let dataDecoded : Data = Data(base64Encoded: id, options: .ignoreUnknownCharacters)!
        let decodedimage = UIImage(data: dataDecoded)
        return decodedimage!
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return nulti.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell//
        cell.cell?.text = nulti[indexPath.row].name
        print(self.picture)
        //let id = self.picture.image!.description
        //cell.logo?.image = picConvertor(id: id)
        return cell
    }
}

Затем я напечатал (self.picture), чтобы увидеть, что происходит, и затем я увидел это

Изображение (id: ноль, формат: ноль, изображение: ноль)

Изображение (id: ноль, формат: ноль, изображение: ноль)

Изображение (id: необязательно (2), формат: необязательно ("png"), изображение: необязательно ("iVBORw0KGgoAAA ...")

Изображение (id: необязательно (2), формат: необязательно ("png"), изображение: необязательно ("iVBORw0KGg ...")

1 Ответ

0 голосов
/ 20 апреля 2019

Проблема в том, что временной порядок вашего кода не является письменным порядком. Ваш getPicture является асинхронным. Данная картина прибудет в некое будущее неизвестное время. Но ваш код просто бросается на что-то. Таким образом, в этих строках:

                for pic in self.nulti{
                    let id = pic.image 
                    if(id != nil){
                        self.getPicture(id: id!.description)
                    }
                }
                self.tableView.reloadData()

... вы перезагружаете представление таблицы до того, как появятся какие-либо фотографии:

                for pic in self.nulti{
                    let id = pic.image 
                    if(id != nil){
                        self.getPicture(id: id!.description)
                        // 2 a picture arrives...
                        // 3 another picture arrives...
                    }
                }
                self.tableView.reloadData() // 1

И поэтому то, что вы делаете, никогда не сработает, перенаправляя все фотографии через одно свойство. Когда и в каком порядке будут поступать фотографии, совершенно неизвестно; таким образом, вы не можете «забрать» картину из собственности. Ваш код асинхронный: вы должны иметь дело с каждой фотографией по мере ее поступления, асинхронно.

...