私はMVVMを使用しようとしていますRealm
2.0.4とReactiveCococa
2.5(Objective-CのAPI)レルムと反応ココア
を使用しています。
VMを基になるRLMObject
に「バインド」しようとしています。私はいくつかの成功を収めました。このような。
RACSignal *invalidationSignal = [[[RACObserve(self, boundedProfile.invalidated)
takeUntil:self.rac_willDeallocSignal]
filter:^BOOL (NSNumber *invalid) {
return [invalid boolValue] == true; // We're only interested in the cases where it was invalidated.
}]
replayLast]; // For multicasting the same value for all subscribers.
@weakify(self);
self.updateSignalDisposable = [[RACObserve(self, boundedProfile.currentProfileTimestamp)
takeUntil:invalidationSignal]
subscribeNext:^(id x) {
@strongify(self)
CYRLMProfile * profile = [CYRLMProfile profileWithID:self.userId];
self.userId = profile.userId;
...
}];
ここに私の問題は私のVMがdealloc'edますとき、私は私のレルムオブジェクトにnil
を設定し、それはまた、有界オブジェクトに関連付けられたrealm
の割り当てを解除することです。
これは、Realmが書き込みトランザクションの途中にあるときに発生します。実行中のスレッドの別のスレッドで書き込みトランザクションをキャンセルしているためクラッシュします。
EDIT:
が問題に展開するには: - RealmObjectは、任意のスレッド からレルムから取得されたことを - - ViewModelに割り当てが解除されたとき、私はRealmObject への強い参照してViewModelにを持っています: - RealmObjectは、そのオブジェクトへの唯一の強力な参照であったため、解放されてしまいました - そのオブジェクトのRLMRealmは、その領域への残りの強力な参照であるため解放されます。 - それが書き込みトランザクション中で、そうであればキャンセルして間違ったスレッドでクラッシュする
RAC観測を削除しても、問題はまだ発生します。 main以外のスレッドにrealmオブジェクトを持つビューモデルを作成してbeginWriteTranscactionを呼び出し、そのオブジェクトをメインスレッドでアンロードして割り当てを解除することで、これを強制的に再現することができます コードは
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
RLMRealm *realm = [RLMRealm defaultRealm];
CYRLMProfile *profile = [CYRLMProfile profileWithId:10 inRealm:realm];
__block ViewModel *vm = [ViewModel viewModelWithProfile:profile];
[realm beginWriteTransaction];
dispatch_async(dispatch_get_main_queue(), ^{
vm = nil;
});
});
また、取得したエラーメッセージやスタックトレースなどを共有できますか?また、アプリ内の各スレッドのRealmの新しいインスタンスを初期化する必要があります。詳しくは、スレッド:https://realm.io/docsのスレッドを参照してください。/objc/latest /#threading – Dmitry
メッセージは "不正なスレッドからアクセスされた領域"で、ここにstacktraceがあります:http://pastebin.com/s0GKVjwq –