簡體   English   中英

Realm 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()會話,我的猜測是框架並不是真的很高興。

我對這種方法的建議如下:

  1. 在從對象中的數據庫獲取數據之前設置您知道的值,其余未設置為某些默認值或將其設置為可選值。
  2. 將對象保存到領域,然后在閉包中調用下載(當然是異步) - 這將在閉包中獲取對象,因為到那時對象將被保存在領域中,您將能夠直接訪問savedObject.realm ,你將能夠正確地編寫,沒有例外。

TL;博士; 您不能將持久化的Realm對象分配給未加載的Realm對象的屬性

知道Foo.get(_:)正在做什么會很有用。 我的猜測是它會創建一個持久化的Realm對象(甚至可能在不同的線程上),而Bar對象永遠不會持久化(調用super.init()只會創建一個獨立的對象,取消鏈接到任何Realm)。

如果我對Foo.get(_:)假設是正確的,那么只需在該函數中創建一個獨立的Foo 然后,您可以在任何寫入事務之外將其設置為Bar的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM