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提供一个不同的视角。谢谢你的回答!