RealmSwift RLM异常

RealmSwift RLMException

我正在为我的项目使用 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)
        }
     }

 }

删除 realm.beginWrite()realm.commitWrite()。使用 realm.write { }.

时不需要它们

我遇到了和你一样的问题和异常。虽然 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 对象等的较大项目时,这当然有缺点。但它适用于小型项目(就像我正在处理,你似乎正在处理) .