![](/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.