为了这个问题,这里有一个简单的例子(有几个快捷方式):
class Foo: Object {
dynamic var id: Int = 0
[...]
}
class Bar: Object {
dynamic var id: Int = 0
dynamic var foo: Foo?
convenience required init(data: AnyObject) {
self.init()
self.id = data.id as! Int
if let foo_id = data.foo_id as? Int {
// Function querying the remote database and returning an object
Foo.get(foo_id) { (foo) -> Void in
self.foo = foo // Foo object assigned, as expected
}
}
}
}
如果我在self.foo = foo
函数的闭包中执行get()
,我会遇到异常:
exception' RLMException',原因:'尝试修改写事务之外的对象 - 首先在RLMRealm实例上调用beginWriteTransaction。'
所以,如果我在它周围添加一个realm.write,就像之前的异常一样:
...
Foo.get(foo_id) { (foo) -> Void in
let realm = Realm(path: Realm.defaultPath)
realm.write {
self.foo = foo
}
}
...
这次我得到一个新的:
例外' RLMException',原因:'无法添加来自不同领域的对象'
我被困住了,我无法弄清楚Realm在这里想要什么,但是医生并没有帮助。
我不习惯Realm,所以我想我的工作方式有些不对,但我不知道是什么。
感谢您的帮助
答案 0 :(得分:4)
好的,问题是这样的 - 当初始化程序本身没有将对象保存在Realm中时,你试图打开write()
会话,而我的猜测是框架对它不是很满意
我对此方法的建议如下:
savedObject.realm
,您将能够无异常地正确编写。答案 1 :(得分:1)
TL;博士;您不能将持久化Realm对象分配给未使用的Realm对象的属性
了解Foo.get(_:)
正在做什么会很有用。我的猜测是它会创建一个持久化的Realm对象(甚至可能在不同的线程上),而Bar
对象永远不会被持久化(调用super.init()
只会创建一个独立的对象,取消链接到任何Realm)
如果我对Foo.get(_:)
的假设是正确的,那么只需在该函数中创建一个独立的Foo
。然后,您就可以在任何写入事务之外将其设置为Bar
的属性。