Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios realmswift:更新闭包内的对象_Ios_Iphone_Swift_Realm - Fatal编程技术网

Ios realmswift:更新闭包内的对象

Ios realmswift:更新闭包内的对象,ios,iphone,swift,realm,Ios,Iphone,Swift,Realm,为了回答这个问题,这里有一个简单的例子(有几个捷径): 如果我在关闭get()函数时执行self.foo=foo,我会遇到一个异常: ... Foo.get(foo_id) { (foo) -> Void in let realm = Realm(path: Realm.defaultPath) realm.write { self.foo = foo } } ... 异常“RLMEException”,原因:“试图在写事务外部修改对象-首先在RLMRealm实例

为了回答这个问题,这里有一个简单的例子(有几个捷径):

如果我在关闭
get()
函数时执行
self.foo=foo
,我会遇到一个异常:

...
Foo.get(foo_id) { (foo) -> Void in
  let realm = Realm(path: Realm.defaultPath)
  realm.write {
    self.foo = foo
  }
}  
...
异常“RLMEException”,原因:“试图在写事务外部修改对象-首先在RLMRealm实例上调用beginWriteTransaction。”

因此,如果我要添加一个realm.write,正如前面的异常所要求的那样:

...
Foo.get(foo_id) { (foo) -> Void in
  let realm = Realm(path: Realm.defaultPath)
  realm.write {
    self.foo = foo
  }
}  
...
这次我买了一个新的:

异常“RLMException”,原因:“无法添加来自不同领域的对象”

我被困住了,我不知道我想要什么领域,医生帮不了我

我不太习惯这个领域,所以我想我在它的工作原理上有些错误,但我不知道是什么


感谢您的帮助

好的,问题是-当对象未保存在初始化器本身的域中时,您试图打开
write()
会话,我猜框架对此并不满意

我对该方法的建议如下:

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

  • tl;博士无法将持久化领域对象分配给未持久化领域对象的属性

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


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

    是否对已保存在任何其他领域的对象执行此操作?除了Realm.defaultPath之外的其他内容?第一个例外是显而易见的-要么执行
    beginWriteTransaction()
    ->write->
    commitWriteTransaction()
    ,要么执行您提到的块。另一个例外情况是,当您试图更新错误域中的对象时,而不是您已将其保存到的域。我只有一个域,我使用的是默认域。我在想,这可能与在对象初始化后在闭包中使用
    self
    有关?我也尝试了
    self.realm.write(){…}
    ,但是
    self.realm
    是可选的,在尝试编写我的对象时为零,所以我看不到使用此选项的意义是的,这是正确的,很抱歉,我一发表评论就意识到了这一点。一个疯狂的评论——用write closure-
    Foo包装整个数据库查询。get
    我对你的答案投了赞成票,因为它是正确的,但我并不完全同意你的建议。我发布了另一个答案,应该为OP提供一个不同的视角。谢谢你的回答!