![](/img/trans.png)
[英]Storing an array of Realm objects inside another Realm object (Swift)
[英]Realm Swift : Update an object inside a closure
为了这个问题,这是一个简单的例子(带有一些快捷方式):
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
}
}
}
}
如果我在get()
函数的闭包中执行self.foo = foo
,我得到一个异常:
异常'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在这里想要什么,文档没有帮助。
我不习惯Realm,所以我想我的工作方式有些不对,但我不知道是什么。
谢谢你的帮助
好的,所以问题是这样的 - 当初始化器本身没有将对象保存在Realm中时,你试图打开write()
会话,我的猜测是框架并不是真的很高兴。
我对这种方法的建议如下:
savedObject.realm
,你将能够正确地编写,没有例外。 TL;博士; 您不能将持久化的Realm对象分配给未加载的Realm对象的属性
知道Foo.get(_:)
正在做什么会很有用。 我的猜测是它会创建一个持久化的Realm对象(甚至可能在不同的线程上),而Bar
对象永远不会持久化(调用super.init()
只会创建一个独立的对象,取消链接到任何Realm)。
如果我对Foo.get(_:)
假设是正确的,那么只需在该函数中创建一个独立的Foo
。 然后,您可以在任何写入事务之外将其设置为Bar
的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.