我有一个我需要保存到领域的大型JSON数组,问题是该操作持续约45秒,而这太长了。我尝试为JSON数组中的每个元素同时运行保存操作:
for element in jsonArray { // jsonArray has about 25 elements
DispatchQueue.global(qos: .userInitiated).async {
let realm = try! Realm()
let savedObject = realm.objects(MyObject.self).filter("name == '(element.name)'")
for subElement in element { // element is an array that has around 1000 elements
let myModel = MyModel(initWith: subElement) // MyModel initialization is a simple light weight process that copies values from one model to another
savedObject.models.append(myModel)
}
}
}
当我尝试运行相同的代码时,但是使用DispatchQueue.main.async
,即使不是并发,也要快地完成2倍。我还尝试使用服务质量.userInteractive
运行上述代码,但这是相同的速度。
运行此代码时,CPU利用率约为30%,内存约为45 MB。是可以加快此操作的速度吗?
- 整个循环应在
DispatchQueue.global(qos: .userInitiated).async
块内部。 -
如Realm网站上的记录:
领域写操作是同步和阻塞,而不是异步。如果螺纹A启动写入操作,则螺纹B在螺纹A完成之前在同一领域上启动写入操作,在螺纹B螺纹B的写入操作之前,螺纹A必须完成并进行交易。写操作总是自动在BeginWrite()上自动刷新,因此不会通过重叠写作创建种族条件。
这意味着您尝试在多个线程中写入任何好处。