gpt4 book ai didi

ios - 当 API 使用 MVVM 完成时重新加载 TableView

转载 作者:行者123 更新时间:2023-11-28 14:25:35 25 4
gpt4 key购买 nike

我正在使用 Swift 4 开发一个应用程序。我正在以编程方式构建我的应用程序 - 没有 Storyboard。

我有一个像这样的 ViewController

class SearchController: UITableViewController {

private let cellID = "cellID"

fileprivate let searchController = UISearchController(searchResultsController: nil)
fileprivate let viewModel = SearchViewModel(client: DiscogClient())

override func viewDidLoad() {
super.viewDidLoad()

setupSearchBar()
setupTableView()
}

fileprivate func setupSearchBar() -> Void {
navigationItem.hidesSearchBarWhenScrolling = false
navigationItem.searchController = searchController

searchController.searchBar.delegate = self

}

fileprivate func setupTableView() -> Void {
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellID)
tableView.tableFooterView = UIView()
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.cellViewModels.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath)
return cell
}

}

extension SearchController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
viewModel.search(term: searchText)
}

}

我有一个看起来像这样的 ViewModel

import Foundation
import UIKit

class SearchViewModel {
var cellViewModels: [Result] = []

private let client: APIClient
var results: SearchResults? {
didSet {
for result in (results?.results)! {
cellViewModels.append(result)
}
}
}

var isLoading: Bool = false {
didSet {
showLoading?()
}
}

var showLoading: (() -> Void)?
var reloadData: (() -> Void)?
var showError: ((Error) -> Void)?

init(client: APIClient) {
self.client = client
}

func search(term: String) {

if let client = client as? DiscogClient {
let endpoint = DiscogsEndpoint.search(term: term, searchType: .release)
client.fetch(with: endpoint) { (either) in

switch either {
case .success(let results):
self.results = results
case .error(let error):
self.showError?(error)
}

}
}
}
}

当我检查 var results: SearchResults? 上的 didSet 时,我可以看到该值是通过我的 APIClient 设置的。

我要做的是指示我的 ViewController 表在设置该值后重新加载它的数据。

虽然我不确定如何实现这一点?我想我可以在 cellViewModels 上使用 didSet 并访问我的 ViewController 上的方法。这不起作用,或者我还不知道该怎么做。

我现在希望看到,通过我的 SearchController 中的 viewModel.cellViewModels.count 更新行数

最佳答案

您可以修改您的搜索以接受完成 block

func search(term: String, @escaping completion :() -> ()) {

if let client = client as? DiscogClient {
let endpoint = DiscogsEndpoint.search(term: term, searchType: .release)
client.fetch(with: endpoint) { (either) in

switch either {
case .success(let results):
self.results = results
completion()
case .error(let error):
self.showError?(error)
completion()
}

}
}
}

终于可以重新加载tableView了

    self.search(term: "abcd") {
self.tableView.reloadData()
}

人们可能经常要求您实现协议(protocol)并在 ViewModel 和 View 之间建立通信。但是是使用 block 还是协议(protocol)始终是设计实现细节:)

希望这对您有所帮助。

关于ios - 当 API 使用 MVVM 完成时重新加载 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618610/

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