【发布时间】:2023-03-30 07:14:01
【问题描述】:
我正在学习 Swift。我有一个问题。
问题- 我有带有图片 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
}
Cell.Swift
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*
}
}
}
}
【问题讨论】:
-
OffersModel是struct吗? -
这是一种危险的方式,因为如果用户滚动并且单元格离开屏幕,您将获得不可预知的行为。请看LazyTableImages
-
是的@Sulthan,它是结构。现在我已经在 Class 和它的工作上改变了它。现在我删除了 completionHandler 回调并在它完成后直接更新。顺便说一句,如果我们使用 completionHandler,我们必须避免转义,这在 Swift 3 中是默认设置的……对吗?
标签: swift swift3 closures capture-list