【发布时间】:2015-07-03 12:31:44
【问题描述】:
为了这个问题,这里有一个简单的例子(有一些快捷方式):
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,所以我想我在它的工作方式上搞错了,但我不知道是什么。
感谢您的帮助
【问题讨论】:
-
您是否对已保存在 ANY 其他 Realm 中的对象执行此操作?除了
Realm.defaultPath之外的其他东西?第一个例外很明显 - 要么做beginWriteTransaction()-> 写 ->commitWriteTransaction()要么你提到的块。当您尝试在 错误 领域中更新对象时,会发生另一个异常,而不是您已经将其保存到的领域。 -
我只有一个Realm,我使用的是默认的。我在想这可能与在对象初始化后在闭包中使用
self有关? -
我也尝试了
self.realm.write() { ...},但self.realm是可选的,在尝试编写我的对象时为零,所以我认为使用这个没有意义 -
是的,没错,对不起,我在发表评论的那一刻就意识到了。
-
一个狂野的 - 将整个数据库查询包装在写闭包中 -
Foo.get