首页 文章

等到另一个进程完成

提问于
浏览
0

我有时间问题..

我的应用程序使用函数 loadData() 将数据加载到tableview中

并且用户可以使用 postData() 发布数据

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


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

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


问题是很少但有时我的应用程序由于这两个函数冲突而退出:当用户发布数据但它当前正在加载数据时 .

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

并防止多个postData() - 同时触发?没有使用大量的bools?有一些共同的方式吗?

1 回答

  • 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 也应该有这样的结构 .


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

相关问题