【发布时间】:2019-01-24 10:04:06
【问题描述】:
我正在尝试构建一个搜索 GitHub 存储库的应用程序。我正在使用 MVVM 和 Moya。当我调用一个搜索方法时,我会在服务器响应之前重新加载表格视图。
所以应用流程应该是:
用户在搜索栏中键入搜索查询。在SearchViewController 的searchBarSearchButtonClicked(_:) 中调用了我的方法进行搜索。该方法在SearchViewModel 内部。所以视图模型的方法触发RepositoryService然后NetworkService。
我放了一些打印语句来查看执行顺序。在控制台中,我得到了:2 3 4 (Here the table view is refreshing) 1。我尝试在不同的地方使用 GCD,也尝试使用障碍。归根结底,在调用print(1) 之前,表格视图仍在刷新。
SearchViewController:
extension SearchViewController: UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
guard let query = searchBar.text, query.count > 2 else { return }
viewModel.searchRepositories(withQuery: query) { [weak self] in
guard let self = self else { return }
print(4)
print("Reloading...")
self.tableView.reloadData()
}
}
}
SearchViewModel:
var repositories = [Repository]()
func searchRepositories(withQuery query: String, completion: @escaping () -> Void) {
repositories = repositoryService.searchRepositories(withQuery: query)
print(3)
completion()
}
RepositoryService:
private var repositories = [Repository]()
func searchRepositories(withQuery query: String) -> [Repository] {
networkService?.searchRepositories(withQuery: query) { [weak self] repositories in
guard let self = self, let repositories = repositories else { return }
self.repositories += repositories
}
print(2)
return self.repositories
}
网络服务:
func searchRepositories(withQuery query: String,
completionHandler: @escaping (([Repository]?) -> Void)) {
provider?.request(.searchRepo(query: query)) { result in
switch result {
case .success(let response):
do {
let repositories = try response.map(SearchResults<Repository>.self)
print(1)
completionHandler(repositories.items)
} catch let error {
print(error.localizedDescription)
}
case .failure(let error):
print(error)
}
}
}
【问题讨论】:
标签: swift multithreading mvvm grand-central-dispatch moya