繁体   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