为什么我连续两次得到空值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我连续两次得到空值?相关的知识,希望对你有一定的参考价值。

我想将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:nil,格式:nil,图片:nil)

图片(id:nil,格式:nil,图片:nil)

图片(id:可选(2),格式:可选(“png”),图片:可选(“iVBORw0KGgo AAA ...”)

图片(id:可选(2),格式:可选(“png”),图片:可选(“iVBORw0KGg ...”)

答案

问题是代码的时间顺序不是书面顺序。你的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

因此,你所做的事情永远无法奏效,通过一个财产汇集所有照片。当图片到达时,按照什么顺序,是完全未知的;因此,你不能“拿起”一个属性的图片。您的代码是异步的:您必须异步处理每张照片。

以上是关于为什么我连续两次得到空值?的主要内容,如果未能解决你的问题,请参考以下文章

android 怎样得到连续两次单击button的时间间隔

为啥我需要按两次后退按钮才能第一次关闭片段?

为啥添加一列时所有行都得到空值?

JVM堆内存很富足时,为啥经常连续发生两次full GC

按钮需要单击两次才能工作 - 为啥?

Kotlin - 如何将空值传递给片段 newInstance 方法?