我在时间安排上有问题。
我的应用程序通过功能loadData()
将数据加载到表视图中
用户可以使用postData()
两者都以某种方式更改了tableView的数据源+单元格。这些功能使用的是Web请求,因此它们不在主线程上,而只是添加到tableView部分。
loadData()将数据库中的数据加载到tableView
postData()将数据保存到数据库,然后将其添加到tableView
问题在于,由于以下两个功能冲突,我的应用程序很少退出,但有时退出:当用户发布数据但当前正在加载数据时。
如何在postData()
完成之前阻止loadData()
?
并且+禁止同时触发多个postData()-s?不使用大量的布尔值?有一些常见的方法吗?
答案 0 :(得分:3)
您可以使用信号量,信号量表明正在使用稀有资源(在这里我们将其视为“数据处理,一次只能拥有一个”)。
let semaphore = DispatchSemaphore.init(value: 1)
在postData
和loadData
中,等待信号量(当一个信号量可用时,它进入,当没有信号量时,进入等待状态,直到一个信号量可用)。
func postData() {
// Make even the waiting on background thread not to block the user
DispatchQueue.global().async {
semaphore.wait()
makeThePostData(completion: {
semaphore.signal()
})
}
}
loadData
也应具有类似的结构。
也尝试使用反应式编程技术,它更现代