0

我正在学习斯威夫特。我有一个问题。

问题- 我有带有图像 url 的 DataModel,所以第一次会从 url 下载图像,当然第二次不会。因此,当我在我的块中获取图像时,我想用图像更新我的数据模型。但它不起作用。

  • 我试过 inout 功能
  • 还有completionHander回调

ViewController.swift

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

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

    var model = offersArray[indexPath.row] as! OffersModel
    cell.updateOfferCellWith(model: model, completionHandler: { image in
        model.image = image
    })///// I am getting image here, but model is not getting update
    return cell
}

细胞.斯威夫特

func updateOfferCellWith(model: OffersModel, completionHandler:@escaping (UIImage) -> Void) {

    if (model.image != nil) { //Second time this block should be execute, but model image is always nil
        DispatchQueue.main.async { [weak self] in
            self?.offerImageView.image = model.image
        }
    }
    else{
        //First time- Download image from URL
        ImageDownloader.downloadImage(imageUrl: model.offerImageURL) { [weak self] image in
            DispatchQueue.main.async {[model] in
                var model = model
                self?.offerImageView.image = image
                //model.image = image*//This is also not working*
                completionHandler(image)*//Call back*
            }
        }
    }
}
4

2 回答 2

0

从评论来看model是一个struct

将 a struct(或任何值类型)传递给方法或将其分配给变量时,struct会复制 。

所以model.image = image其实是分给image了一个全新的model而不是原来的model

使用引用类型 (a class) 将修复它。

于 2017-05-05T17:06:08.460 回答
0

以下是基于您的代码的潜在解决方案,但是,正如 vadain 在评论中所说,这有点危险,因为图像加载是异步的,并且可能在单元格不再存在时返回图像。

理想情况下,您要做的是以持久性的方式设置模型,并且它应该发送异步请求以下载其图像。然后,当图像返回时,它会更新模型,并且模型会广播一条消息,说明它的图像已更新。细胞可以在它们存在时监听并响应模型的更新。

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

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

    var model = offersArray[indexPath.row] as! OffersModel

    if image = model.image {
        // setting directly here... you could call an image on the cell if you want more data encapuslation
        cell.offerImageView.image = model.image
    } else {
        ImageDownloader.downloadImage(imageUrl: model.offerImageURL) { [weak self] image in
            DispatchQueue.main.async {
                model.image = image
                cell.offerImageView.image = image
            }
        }
    }

    return cell
}
于 2017-05-02T20:42:06.627 回答