1

我有一个案例,我在后台线程中的 Dispatch.global 中将数据保存到 Realm 数据库,然后在同一个线程中我调用 Dispatch.main.async 从 Realm 获取数据并更新 UITableView 数据。

问题是我得到的数据数量减少了(data.count)。假设总数据数为 10,那么有时我有时会得到所有数据,有时会少于 10。

为什么会这样?

以下是示例代码片段

func getData(data: [String]) {
    DispatchQueue.global(qos: .background).async {
        RealmManager.removeDataFromRealm()
        RealmManager.saveDataToRealm(data)
        Dispatch.main.async {
            let dataFromRealm = RealmManager.getDataFromRealm()
            self.sendDataToUI(dataFromRealm)
        }
    }
}

在上面的代码中 removeDataFromRealm()、saveDataToRealm(data)、getDataFromRealm() 是领域类静态函数,我在其中保存、删除、从领域数据库中获取数据

我已经从我理解的所有方面调试了代码,它保存(saveDataToRealm(data))所有数据,然后获取(getDataFromRealm())数据,根据我的理解,为什么它有时会向我发送更少的数据

在获取数据时,RealmManager getDataFromRealm() 静态方法没有应用过滤器。

假设上面的代码进入竞争状态,那么下面的代码片段会发生什么

    func getImageFromServer (url: URL) {
        DispatchQueue.global(qos: .background).async {
            do {
                let data = try Data(contentsOf: url)
                DispatchQueue.main.async {
                    self.imageView.image = UIImage(data: data)
                }
            }catch {
                print(error)
            }
        }
    }

由于 getImageFromServer() 首先获取数据,然后 Dispatch.main.async 在将“Data(contentsOf: url)”转换为显然需要时间的数据后执行。

为什么在上述情况下它的工作方式不同?

4

1 回答 1

0

如果您的RealmManager.removeDataFromRealm()and/orRealmManager.saveDataToRealm(data)是异步的,那么您在这里陷入了竞争状态,因为在DispatchQueue.main执行代码之前无法保证您的数据已保存。您可以做的是使用DispatchGroup等待上述两种方法完成后再进入DispatchQueue.main.async

回答标题中的问题,如果你在全局队列中,然后在全局队列中执行代码,那么 swift 所做的本质上就是从前者切换到后者。

于 2018-11-19T02:55:49.033 回答