gpt4 book ai didi

swift - RealmSwift RLM异常

转载 作者:搜寻专家 更新时间:2023-10-30 21:50:43 27 4
gpt4 key购买 nike

我正在为我的项目使用 RealmSwift。但是,我不确定如何解决以下问题:

RMLException: Attempting to modify object outside of a write transaction - call beginWriteTransaction on an RLMRealm instance first

抛出。

有人知道吗?

import RealmSwift

func createOrUpdateMachineInRealm(machine: Machine){

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT

dispatch_async(dispatch_get_global_queue(priority, 0)) {
// do some task
let realm = Realm()

realm.beginWrite()

realm.write{
realm.add(machine, update: true)
}

realm.commitWrite()

dispatch_async(dispatch_get_main_queue()) {
// update some UI
actionDelegate?.operationCompleted(true)
}

}
}

解决方案:我也传入机器的参数,并在 realm.write() 中将它们分配给机器

 func createOrUpdateMachineInRealm(machine: Machine, name: String){

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT

dispatch_async(dispatch_get_global_queue(priority, 0)) {
// do some task
let realm = Realm()

realm.write{
machine.name = name
realm.add(machine, update: true)
}
}

}

最佳答案

我刚刚遇到了和你一样的问题和异常。虽然 Nate Mann的答案不是解决问题的方法,它引导我朝着正确的方向前进。

您不能修改之前从数据库中提取的 Realm 对象,因为当它(无论出于何种原因)位于不同队列时,Realm 会尝试更新它并抛出错误。

因此,您要么必须在 realm.write{ } 语句中进行所有修改,要么创建一个具有相同主键的新对象,以便正确更新。这也意味着您不能用一个函数来创建更新,而是需要两个单独的函数。

您的更新函数必须如下所示:

func updateMachineInRealm(machine: Machine){
var updatedMachine = Machine()
updatedMachine.name = machine.name
updatedMachine.value = machine.value + 42
updatedMachine.primaryKey = machine.primaryKey
// "transfer" or modify all the values of the old machine object

let realm = try! Realm()
do {
try realm.write() {
realm.add(updatedMachine, update: true)
}
}

请记住,您需要一个唯一的主键才能使此代码起作用,因为这就是 Realm 将在数据库中与您的新对象匹配的主键。

此外,当处理具有多个线程访问 Realm 对象等的较大项目时,这当然有缺点。但它适用于小型项目(就像我正在处理,你似乎正在处理)。

关于swift - RealmSwift RLM异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30756349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com