当我的应用程序在后台并且我正在使用 Realm 数据库时,我间歇性地收到“RUNNINGBOARD 0xdead10cc”错误。我怀疑该错误与数据库写入期间的文件锁定有关。我试过给write block加sleep,但是测试的时候没有报错
这是我用来更新我的 Realm 数据库的函数的代码片段:
func update(completion: @escaping () -> ()) {
let dispatchGroup = DispatchGroup()
array1 = Array(Set(self.arrayData))
for element in array1 {
dispatchGroup.enter()
element.updateRealmModel {
dispatchGroup.leave()
}
}
dispatchGroup.notify(queue: .main) {
completion()
}
}
和元素函数:
func updateRealmModel(completion: @escaping(() -> Void)) {
let primaryKey = self.id
DispatchQueue.global(qos: .userInitiated).async {
let realm = try! Realm()
if let user = realm.object(ofType: Mytype, forPrimaryKey: primaryKey) {
do {
try realm.write {
user.boolField = false
}
} catch let error {
debugPrint(error)
}
}
completion()
}
}
谁能帮我重现并解决这个错误?当应用程序处于后台时,是否存在任何与 Realm 数据库写入相关的已知问题?对于如何调试和解决此问题的任何见解或建议,我将不胜感激。
我不认为 RUNNINGBOARD 错误与这个用例中的 Realm 直接相关。
似乎不需要那些 DispatchQueues,在某些情况下,可能很难管理 - 以及完成处理程序,哇哦。
由于要更新的每个用户的主键是已知的,因此没有理由查询用户 - 您已经通过他们的主键知道他们是谁。
这似乎是少量数据,如果他的数组大小合理,我的第一个建议是通过主键直接在循环内更新每个用户对象。
array1 = Array(Set(self.arrayData))
for element in array1 {
let _id = element.id
try! realm.write {
realm.create(UserClass, value: ["_id": _id, "boolField": false], update: .modified)
}
}
以上内容将每个用户的 boolField 属性更新为 false,并在 array1 中找到主键,并且不会修改任何其他属性。
也就是说,如果它是一个大循环,它会占用 UI,因此您也可以将整个过程转储到单个后台线程
DispatchQueue(label: "background").async {
autoreleasepool {
//write the data
这是我们在数据集庞大时使用的技术。
另一种选择是利用
writeAsync
函数异步更新对象
可以在此处找到很好的解释和示例代码异步更新对象