领域 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,我得到一个异常:

exception 'RLMException', reason: 'Attempting to modify object outside of a write transaction - call beginWriteTransaction on an RLMRealm instance first.'

因此,如果我在其周围添加一个 realm.write,如前一个例外所要求的那样:

...
Foo.get(foo_id) { (foo) -> Void in
  let realm = Realm(path: Realm.defaultPath)
  realm.write {
    self.foo = foo
  }
}  
...

这次我换了一个新的:

exception 'RLMException', reason: 'Can not add objects from a different Realm'

我被卡住了,我无法弄清楚 Realm 在这里想要我做什么,文档没有帮助。

我不太习惯 Realm,所以我想我对它的工作方式有误,但我不知道是什么。

感谢您的帮助

好的,所以问题是这样的 - 当对象没有保存在初始化程序本身的 Realm 中时,您试图打开 write() 会话,我猜框架对此并不满意.

我对该方法的建议是:

  1. 将对象中从数据库中获取数据之前知道的值和其他未设置的值设置为一些默认值或将它们设置为可选值。
  2. 将对象保存到领域,然后在闭包中调用下载(当然是异步的)——这将在闭包中获取对象,因为到那时对象已经保存在领域中,您将能够直接访问savedObject.realm,您将能够正确写入,无一例外。

tl;博士;您不能将持久化的 Realm 对象分配给非持久化的 Realm 对象 属性

了解 Foo.get(_:) 在做什么会很有用。我的猜测是它创建了一个持久化的 Realm 对象(甚至可能在不同的线程上),而 Bar 对象永远不会被持久化(调用 super.init() 只会创建一个独立的对象,不链接到任何领域) .

如果我对 Foo.get(_:) 的假设是正确的,只需在该函数中创建一个独立的 Foo。然后,您将能够在任何写入事务之外将其设置为 Bar 的 属性。