2017-01-30 10 views
0

setterを使用して、Realmオブジェクトのプロパティが更新されていても成功していない場合、呼び出しコードでRealmトランザクションを使用する必要性を排除しようとしています。 someInt用セッターでRealmオブジェクトのSetterが呼び出されない

@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]; 
    } 
} 

その後、setSomeIntが取得する例えば

は、私は、次のレルムのクラスを持っていると仮定します

Caller* caller = [[Caller alloc] init]; 
caller.someInt = 8; 

ファインですが、呼び出し元オブジェクトが保存されてレルムaに保存されている場合NDその後、someIntが再び変更され、その後、次のエラーが発生します。

「RLMException」、理由:「 書き込みトランザクションの外でオブジェクトを変更しようとする - 最初RLMRealmインスタンス上beginWriteTransactionを呼び出します」

しかし、これはセッターのポイントを防ぐためにしようとしている正確に何である - 必要に応じてトランザクションを作成しますが、レルム・エラーがsetSomeIntが、この場合に呼ばなっている「前に発生」しています。オブジェクトがRealmに格納されているときにセッターが呼び出されないのはなぜですか?それより前に呼び出されています。メソッドを使用してプロパティを明示的に設定する必要はありません。

答えて

0

短い答えはRealm does not support overriding getters and setters for persisted propertiesです。

RealmはRealmによって管理されているクラスのインスタンス用にカスタムゲッター/セッターを挿入するため、その動作が観察される理由があります。これらのgetter/setterは、基礎となるレルムファイルからデータを読み書きします。上記のリンクで説明した回避策(カスタム取得/設定動作のためにRealmが無視する別のプロパティを使用し、無視されないプロパティに格納する)は、目的に応じて動作します。

関連する問題