【问题标题】:Setter for Realm object not invoked未调用领域对象的设置器
【发布时间】: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


    【解决方案1】:

    简短的回答是Realm does not support overriding getters and setters for persisted properties

    您观察到您所做行为的原因是因为 Realm 为您的类实例插入了自定义 getter / setter,这些实例由 Realm 管理。这些 getter/setter 负责从底层 Realm 文件中读取/写入数据。上面链接中提到的解决方法(使用 Realm 忽略的单独属性用于自定义获取/设置行为,存储到非忽略属性)可能适用于您的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多