【问题标题】:Realm Swift : Update an object inside a closureRealm Swift:更新闭包内的对象
【发布时间】:2015-07-03 12:31:44
【问题描述】:

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

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,所以我想我在它的工作方式上搞错了,但我不知道是什么。

感谢您的帮助

【问题讨论】:

  • 您是否对已保存在 ANY 其他 Realm 中的对象执行此操作?除了Realm.defaultPath 之外的其他东西?第一个例外很明显 - 要么做 beginWriteTransaction() -> 写 -> commitWriteTransaction() 要么你提到的块。当您尝试在 错误 领域中更新对象时,会发生另一个异常,而不是您已经将其保存到的领域。
  • 我只有一个Realm,我使用的是默认的。我在想这可能与在对象初始化后在闭包中使用 self 有关?
  • 我也尝试了self.realm.write() { ...},但self.realm 是可选的,在尝试编写我的对象时为零,所以我认为使用这个没有意义
  • 是的,没错,对不起,我在发表评论的那一刻就意识到了。
  • 一个狂野的 - 将整个数据库查询包装在写闭包中 - Foo.get

标签: ios iphone swift realm


【解决方案1】:

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

我对这种方法的建议是这样的:

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

【讨论】:

  • 我赞成您的回答,因为它是正确的,但我并不完全同意您的建议。我发布了另一个答案,应该为 OP 提供不同的视角。感谢您的回答!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多