swift 'RUNNINGBOARD 0xdead10cc' 当应用程序处于后台时写入 Realm 数据库时出错

问题描述 投票:0回答:1

当我的应用程序在后台并且我正在使用 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 数据库写入相关的已知问题?对于如何调试和解决此问题的任何见解或建议,我将不胜感激。

swift realm realm-mobile-platform swift-concurrency ios-background-mode
1个回答
0
投票

我不认为 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
函数异步更新对象

可以在此处找到很好的解释和示例代码异步更新对象

© www.soinside.com 2019 - 2024. All rights reserved.