Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将图像异步加载到自定义UITableViewCell部分工作_Ios_Swift_Firebase_Tableview_Tableviewcell - Fatal编程技术网

Ios 将图像异步加载到自定义UITableViewCell部分工作

Ios 将图像异步加载到自定义UITableViewCell部分工作,ios,swift,firebase,tableview,tableviewcell,Ios,Swift,Firebase,Tableview,Tableviewcell,“我的图像”不会加载到imageview中,除非您将单元格从表格中滚动并重新打开,或者转到另一个视图并返回到视图(重画单元格) 如何使它们正确加载 ///////// 我的viewDidLoad中包含以下内容: tableView.delegate = self tableView.dataSource = self DispatchQueue.global(qos: .background).async { self.getBusinesses()

“我的图像”不会加载到imageview中,除非您将单元格从表格中滚动并重新打开,或者转到另一个视图并返回到视图(重画单元格)

如何使它们正确加载

/////////

我的viewDidLoad中包含以下内容:

    tableView.delegate = self
    tableView.dataSource = self

    DispatchQueue.global(qos: .background).async {
        self.getBusinesses()

        DispatchQueue.main.async {

            self.tableView.reloadData()


        }
    }
我调用函数在viewDidLoad中调用的.GetBusinesss函数中下载图像:

func getBusinesses() -> Array<Business> {

    var businessList = Array<Business>()
    //let id  = 1
    let url = URL(string: "**example**")!
    let data = try? Data(contentsOf: url as URL)
    var isnil = false

    if data == nil{
        isnil = true
    }
    print("is nill is \(isnil)")


    if(data == nil){
        print("network error")
        businessList = []
        return businessList
    }
    else{
        values = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
    }

    let json = JSON(values)

    var i = 0;
    for (key, values) in json {

        var businessReceived = json[key]
        let newBusiness = Business(id: "18", forename: "", surname: "", email: "", password: "", business: true, level: 1, messageGroups: [], problems: [])

        newBusiness.name = businessReceived["name"].stringValue
        newBusiness.description = businessReceived["description"].stringValue
        newBusiness.rating = Int(businessReceived["rating"].doubleValue)
        newBusiness.category = businessReceived["category"].intValue
        newBusiness.distance =  Double(arc4random_uniform(198) + 1)
        newBusiness.image_url  = businessReceived["image"].stringValue
        newBusiness.url  = businessReceived["url"].stringValue
        newBusiness.phone  = businessReceived["phone"].stringValue
        newBusiness.postcode  = businessReceived["postcode"].stringValue
        newBusiness.email = businessReceived["email"].stringValue
        newBusiness.id = businessReceived["user_id"].stringValue

        if(newBusiness.image_url  == ""){
            newBusiness.getImage()

        }
        else{
            newBusiness.image = #imageLiteral(resourceName: "NoImage")
        }


        if(businessReceived["report"].intValue !=  1){
            businessList.append(newBusiness)

        }
    }

    businesses = businessList

    print(businesses.count)
    holdBusinesses = businessList
    return businessList

}
然后我将其输出到tableview中:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell  = self.tableView.dequeueReusableCell(withIdentifier: "Cell", for : indexPath) as! BusinessesViewCell


            cell.businessImage.image = businesses[(indexPath as NSIndexPath).row].image


            //.............  

     return cell
}
应该成为

    DispatchQueue.main.async {
         self.image = UIImage(data: data!)!
    }
里面

    storageRef.data(withMaxSize: 30 * 1024 * 1024) { data, error in
编辑:我最初的想法是下载逻辑在细胞内,现在我知道它不是

您需要在每次访问tableView时调用reloadData()

         self.image = UIImage(data: data!)!
或者更好的办法是找出您刚刚更新的索引,然后调用

  tableView.reloadRows:[IndexPath]
你可以用

cell.businessImage.setNeedsLayout()

如果您使用SDWebImages会更好,但如果您记住下载是异步的,则更为相关-因此在调用tableView时没有可用的数据。viewDidLoad中的reloadData()查看委托调用,并使用它们触发视图,仅当数据可用时才重新加载tableView。这很有趣,如果在下载图像时加载tableview,那就太完美了!您在@russell这方面有经验吗?您在哪里用返回的图像填充数组业务[]?downloadImage()只显示为设置一个值。此外,如果您在同一个类中执行所有操作,那么它甚至比使用委托更简单—只需确保从viewdidload中调用的downloadIn GetBusinesss函数的完成处理程序中刷新tableView,现在将修改原始代码,让您看到@russell您建议如何使用self.image=UIImage(data:data!)这两种方法中的任何一种!是否在对象中的方法中,因此无法从该方法重新加载数据,还因为第二种方式,tableview最初是从我拥有所有数据时加载的@SeanlIntern888道歉应该说getImage(),复制了错误的函数,但它们除了名称之外都是相同的,所以在这里更改了我的代码。正如您现在看到的,您知道了正确的名称,它在getbusinesss()中被调用,抱歉@SeanLintern88I会将getImage移动到单元格中。。。。然后给单元格指定路径,然后下载。抱歉@SeanLintern88我没有完全理解你的意思。将getImage()函数放入单元格,然后在使用路径配置单元格时,获取图像
  tableView.reloadRows:[IndexPath]
cell.businessImage.setNeedsLayout()