我使用Realm是因为它有用且性感。
我尝试在视图控制器中处理用户设置,方法是在字段值更改时更改用户属性。
由于User
是RLMObject
的子类,我必须按照惯例进行操作
[self.defaultRealm beginWriteTransaction];
user.name = textfield.text;
[self.defaultRealm commitWriteTransaction];
围绕每个用户属性集。
但这样Realm会写出所有更改,如果我点击"取消",之前的值将被覆盖。
放弃更改的更好方法是什么?
编辑:
我可以通过调用viewDidLoad
:
[self.defaultRealm beginWriteTransaction];
didPressOk
中的
[self.defaultRealm commitWriteTransaction];
didPressCancel
中的
[self.defaultRealm cancelWriteTransaction];
但我觉得这不是正确的解决方案,我担心它会导致死锁......
答案 0 :(得分:2)
最简单的方法是向您的班级添加- (void)save;
方法。
- (void)save
{
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm addOrUpdateObject:self];
[realm commitWriteTransaction];
}
每次更改属性时都不要开始/提交更改。 (在任何情况下都是非常低效的)。相反,请进行正常更改,然后在用户完成后调用save
。如果您不调用save,则更改将不会保留。
此外,你的直觉是对的:你不应该在[self.defaultRealm beginWriteTransaction]
上致电viewDidLoad
;如果您在视图控制器打开时碰巧在应用程序中的任何其他位置打开事务,则应用程序将崩溃。
如果您已经保留了此特定对象,请先复制它,这样您就可以更改属性而不会引发异常。
答案 1 :(得分:0)
@Pteofil是正确的,你可以创建一个独立的RLMObject,然后决定是否要使用createOrUpdateInRealm:
将它添加到领域,你可以在这里阅读更多相关信息http://realm.io/docs/cocoa/latest/#updating-objects
答案 2 :(得分:0)
我建议实施一个"克隆"该方法将复制原始对象,然后使用克隆的对象从用户输入接收修改后的值。
由于原始对象和克隆对象将共享相同的"主键"如果你想保存调用领域方法realm.add(clonedobject,update:true)来提交你的更改,或者如果你想放弃更改就不要做任何事情,因为原始对象没有被修改。