如果我将Dispatch.main.async块放入Dispatch.global.async中会发生什么?

时间:2018-11-16 14:40:26

标签: swift realm grand-central-dispatch dispatch-async dispatch-queue

在某些情况下,我是在后台线程中的Dispatch.global中将数据保存到Realm数据库中,然后在我称为Dispatch.main.async的同一线程中将数据从Realm中获取并更新UITableView Data。

问题是我获取的数据(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()首先获取数据,然后在将“ Data(contentsOf:url)”转换为显然很费时的数据之后执行Dispatch.main.async。

请帮助我理解为什么在上述情况下它的工作方式有所不同...预先感谢

1 个答案:

答案 0 :(得分:0)

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

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