等到另一个过程完成

时间:2018-07-20 17:33:36

标签: swift function asynchronous

我在时间安排上有问题。

我的应用程序通过功能loadData()将数据加载到表视图中

用户可以使用postData()

发布数据

两者都以某种方式更改了tableView的数据源+单元格。这些功能使用的是Web请求,因此它们不在主线程上,而只是添加到tableView部分。


loadData()将数据库中的数据加载到tableView

postData()将数据保存到数据库,然后将其添加到tableView


问题在于,由于以下两个功能冲突,我的应用程序很少退出,但有时退出:当用户发布数据但当前正在加载数据时。

如何在postData()完成之前阻止loadData()

并且+禁止同时触发多个postData()-s?不使用大量的布尔值?有一些常见的方法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用信号量,信号量表明正在使用稀有资源(在这里我们将其视为“数据处理,一次只能拥有一个”)。

let semaphore = DispatchSemaphore.init(value: 1)

postDataloadData中,等待信号量(当一个信号量可用时,它进入,当没有信号量时,进入等待状态,直到一个信号量可用)。

func postData() {
    // Make even the waiting on background thread not to block the user
    DispatchQueue.global().async {
        semaphore.wait()
        makeThePostData(completion: {
            semaphore.signal()
        })
    }
}

loadData也应具有类似的结构。


也尝试使用反应式编程技术,它更现代