【问题标题】:Wait until another process finishes等到另一个进程完成
【发布时间】:2018-07-21 01:47:21
【问题描述】:

我的时间有问题..

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

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

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


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

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


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

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

并且 + 防止超过 1 个 postData()-s 同时触发?不使用很多布尔值?有什么常用的方法吗?

【问题讨论】:

  • 布尔如果没有正确同步可能会有很多问题,如果同步,你会有性能损失(但很小),如果你愿意,你也可以尝试自旋锁,但我认为它有点不安全,因此像 Semaphores 一样使用 Apple 的 API 本身更安全,应该从旧线程迁移到调度。

标签: swift function asynchronous


【解决方案1】:

您可以使用信号量,信号量表示正在使用稀有资源(我们这里认为是“数据处理,我们一次只有一个”)。

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


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

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2021-11-12
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多