gpt4 book ai didi

ios - Collection View 单元格中的网络任务

转载 作者:行者123 更新时间:2023-11-29 05:36:12 25 4
gpt4 key购买 nike

我正在为我的 ios 应用程序使用 mvp 模式。我有一个带有 TableView 的 View Controller 。在它的演示者中,我加载了要代表的单元格的项目数组。然后在 cellForRowAtIndexPath: 中,我初始化单元格演示器并将它们设置为单元格。问题是我需要额外的数据,而这些数据只能通过使用项目中包含的字段运行网络请求来获取。我尝试在设置单元格演示器后立即执行此请求,但这会影响滚动的平滑度。我应该怎样做才正确呢?在 View Controller 中我得到:

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

在表格 View 单元格中我有

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()
}

}
}
}

最佳答案

单元格可以立即释放。更好的做法是在模型中执行网络请求。

  • 将网络请求代码移至模型类或结构中。
  • 在模型中声明一个闭包来更新 View 。
  • cellForRow 中,将当前模型项的闭包分配给单元格中的可选属性。
  • 当数据可用时,调用模型中的闭包。
  • 如果需要,您甚至可以在 tableView(_:didEndDisplaying:forRowAt:) 中取消网络请求。

关于ios - Collection View 单元格中的网络任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57014485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com