ios - TableView重新加载前如何设置模型数据
问题描述
TableView 在设置模型数据(topRatedModel)之前重新加载,因此模型保持为零。我使用了主胎面,但它不起作用。我怎样才能解决这个问题 ?您可以在以下位置查看我的代码:https ://github.com/melisaozturk/MVVM (主分支是最新的)
class MovieViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
let viewModel = MovieViewModel()
var topRatedModel: MovieTopRatedModel!
var nowPlayingModel: MovieNowPlayingModel!
var popularModel: MoviePopularModel!
override func viewDidLoad() {
super.viewDidLoad()
self.tableRegister()
self.viewModel.getTopRatedData(completion: { [weak self] response in
if let _ = self {return}
self!.topRatedModel = response
}, completionHandler: { [weak self] error in
if let _ = self {return}
})
self.viewModel.getNowPlayingData(completion: { [weak self] response in
if let _ = self {return}
self!.nowPlayingModel = response
}, completionHandler: { [weak self] error in
if let _ = self {return}
})
self.viewModel.getPopularData(completion: { [weak self] response in
if let _ = self {return}
self!.popularModel = response
}, completionHandler: { [weak self] error in
if let _ = self {return}
})
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
private func tableRegister() {
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.separatorStyle = .none
self.tableView.tableFooterView = UIView()
self.tableView.separatorStyle = .none
self.tableView.register(UINib(nibName: "MovieCell", bundle: nil), forCellReuseIdentifier: "MovieCell")
}
}
解决方案
一旦所有数据完成加载,您需要重新加载表视图。您的代码现在会在这些网络操作仍在运行时重新加载表格视图。
现在,您有三个网络操作,并且您不想重新加载,直到它们全部完成并且您不知道它们将按什么顺序完成。
您可以在这里使用 aDispatchGroup
来帮助您。
使用notify
on aDispatchGroup
可以在调度组为空时执行一些代码。
您的处理也有一些错误weak self
- 如果 self 不为零,您的代码将返回。你想要相反的。
override func viewDidLoad() {
super.viewDidLoad()
self.tableRegister()
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
self.viewModel.getTopRatedData(completion: { [weak self] response in
if let self = self else {
self.topRatedModel = response
}
dispatchGroup.leave()
}, completionHandler: { [weak self] error in
dispatchGroup.leave()
})
dispatchGroup.enter()
self.viewModel.getNowPlayingData(completion: { [weak self] response in
if let self = self {
self.nowPlayingModel = response
}
dispatchGroup.leave()
}, completionHandler: { [weak self] error in
dispatchGroup.leave()
})
self.viewModel.getPopularData(completion: { [weak self] response in
if let self = self {
self.popularModel = response
}
dispatchGroup.leave()
}, completionHandler: { [weak self] error in
dispatchGroup.leave()
})
dispatchGroup.notify {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
从风格的角度来看,我会使用一个Result
类型或至少一个闭包来接受 a(Response?,Error?)
而不是两个闭包。
推荐阅读
- excel - 如何使用excel公式计算文本字符串“7.00 pm to 8.00 pm”或“11.00 am to 12.00 pm”的小时差
- haskell - lts 9.9 与 ghc 8.0.2 相关联。为什么它使用 8.0.1
- html - 固定背景视频使其他固定元素剪辑
- scala - 理解流中的递归
- html - 节点 JS-HTML 链接
- java - 与参数类型不同的方法头
- arrays - Scala scala.util.Sorting.quickSort 正在改变数组的值?
- git - 在 github 中删除了本地分支
- vba - 如何将 Word VBA Range.Find 返回的范围扩大到段落末尾
- android - 如何将 API 中的记录删除应用到连接到此 API 的应用程序?