Realm Swift:更新闭包内的对象

时间:2015-07-03 12:31:44

标签: ios iphone swift realm

为了这个问题,这里有一个简单的例子(有几个快捷方式):

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
      }
    }
  }
}

如果我在self.foo = foo函数的闭包中执行get(),我会遇到异常:

  

exception' 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,所以我想我的工作方式有些不对,但我不知道是什么。

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

好的,问题是这样的 - 当初始化程序本身没有将对象保存在Realm中时,你试图打开write()会话,而我的猜测是框架对它不是很满意

我对此方法的建议如下:

  1. 在从对象中的数据库获取数据之前设置您知道的值,其余部分不要设置为某些默认值或将它们设置为可选值。
  2. 将对象保存到领域,然后在闭包中调用下载(当然是异步) - 这将在闭包中获取对象,因为到那时对象将被保存在领域中,您将能够直接访问savedObject.realm,您将能够无异常地正确编写。

答案 1 :(得分:1)

TL;博士;您不能将持久化Realm对象分配给未使用的Realm对象的属性

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

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