我正在使用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];
但我觉得这不是正确的解决方案,我担心这会导致僵局……
最佳答案 最简单的方法是添加 – (void)保存;你班上的方法.
- (void)save
{
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm addOrUpdateObject:self];
[realm commitWriteTransaction];
}
每次更改属性时都不要开始/提交更改. (在任何情况下都是非常低效的).相反,请进行正常更改,然后在用户完成后调用save.如果您不调用保存,则更改将不会保留.
另外,你的直觉是正确的:你不应该在viewDidLoad上调用[self.defaultRealm beginWriteTransaction];如果您在视图控制器打开时碰巧在应用程序中的任何其他位置打开事务,应用程序将崩溃.
如果您已经保留了此特定对象,请先复制它,这样您就可以在不引发异常的情况下更改属性.