收集视图单元中的网络任务

时间:2019-07-12 22:01:07

标签: ios swift uicollectionview mvp

我正在为我的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()
            }

        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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