我正在为我的ios应用程序使用mvp模式。
我有一个带有表视图的视图控制器。在其演示者中,我加载了要表示单元格的项目数组。然后在cellForRowAtIndexPath:
中,我要初始化单元格演示者并将其设置为单元格。问题是,我需要仅通过运行包含项目中包含的字段的网络请求才能获得的其他数据。我尝试在设置单元格展示器后立即执行此请求,但这会影响滚动的平滑度。我应该如何正确做?
在视图控制器中,我得到了:
override func viewDidLoad() {
super.viewDidLoad()
setUp()
presenter.loadAllDocuments()
}
然后在演示者中
func loadAllDocuments() {
documentService.loadAllDocuments { [weak self] documents in
self?.documents = documents
self?.cellPresenters = documents.compactMap { MaterialCellPresenter(with: $0) }
DispatchQueue.main.sync {
self?.view.reloadData()
}
}
}
在cellForRowAtIndexPath中:
if var cellPresenter = presenter.cellPresenters[indexPath.row] {
cellPresenter.view = cell
cell.presenter = cellPresenter
}
return cell
在我拥有的表格视图单元格中
var presenter: MaterialCellPresenterProtocol! {
didSet {
setUp()
}
}
private func setUp() {
documentIcon.image = presenter.documentIcon
documentTitle.text = presenter.displayName
presenter.getDocumentInfo()
}
最后是单元格演示者
func getDocumentInfo() {
if let id = document.questionID {
documentService.question(with: id) { [weak self] question in
self?.documentQuestion = question
DispatchQueue.main.async {
self?.view.updateDocumentInfo()
}
}
}
}
答案 0 :(得分:0)
可以立即释放单元。更好的做法是在模型中执行网络请求。
cellForRow
中,将当前模型项的关闭项分配给单元格中的可选属性。tableView(_:didEndDisplaying:forRowAt:)
中取消网络请求。