per*_*wyl 7 realm swift xcode6.3
我正在使用RealmSwift我的项目.但是,我不确定如何解决以下问题:
RMLException:试图修改写入事务以外的对象-调用beginWriteTransaction上的RLMRealm实例第一
抛出.
任何人都有任何线索?
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
解决方案:我也传入机器的参数并将它们分配给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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我和你一样有同样的问题和例外.虽然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)
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,您需要一个唯一的主键才能使此代码正常工作,因为Realm将在数据库中匹配您的新对象.
此外,当使用多个线程访问Realm对象等更大的项目时,这当然有缺点.但它适用于小项目(就像我正在努力,你似乎正在努力).
| 归档时间: |
|
| 查看次数: |
7017 次 |
| 最近记录: |