在某些情况下,我是在后台线程中的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。
请帮助我理解为什么在上述情况下它的工作方式有所不同...预先感谢
答案 0 :(得分:0)
如果您的error_log()
和/或RealmManager.removeDataFromRealm()
是异步的,那么您就陷入了竞争状态,因为无法保证在RealmManager.saveDataToRealm(data)
中的代码被保存之前,您的数据已保存被执行。您可以做的是使用DispatchQueue.main
等待上述两种方法完成后再输入DispatchGroup
。
要回答标题中的问题,如果您处于全局队列中,然后在全局队列中执行代码,那么swift本质上就是从前者切换到后者。