【发布时间】:2017-01-30 18:25:10
【问题描述】:
我正在尝试使用 setter 来消除调用代码的需要,以便在更新 Realm 对象的属性时必须使用 Realm 事务,但没有成功。
例如,假设我有以下 Realm 类:
@interface Caller : RLMObject
@property (strong, nonatomic) NSString * _Nullable name;
@property (strong, nonatomic) NSString * _Nullable number;
@property (assign, nonatomic) int someInt;
@end
使用 someInt 的设置器如下:
@implementation Caller
- (instancetype) init
{
self = [super init];
return self;
}
- (void)setSomeInt: (int) newValue
{
RLMRealm *realm = [self realm];
if (realm)
{
[realm beginWriteTransaction];
}
_someInt = newValue;
if (realm)
{
[realm commitWriteTransaction];
}
}
现在如果我创建一个新对象并设置 someInt 然后 setSomeInt 被调用:
Caller* caller = [[Caller alloc] init];
caller.someInt = 8;
很好,但是如果调用者对象然后保存保存到Realm,然后再次更改someInt,则会出现以下错误:
'RLMException', reason: '试图修改外部对象 write transaction - 在 RLMRealm 实例上调用 beginWriteTransaction 首先。'
但这正是 setter 试图阻止的点——在必要时创建事务,但在这种情况下,Realm 错误“发生在”setSomeInt 被调用之前。为什么当对象已经存储到Realm时setter没有被调用,而是在此之前被调用,有没有不用通过方法显式设置属性的解决方案?
【问题讨论】:
标签: ios objective-c realm