我正在使用Test3
2.0.4和Realm
2.5(Objective-C API)
我正在尝试使用MVVM。
我正在尝试将我的VM“绑定”到基础ReactiveCococa
。我取得了一些成功。像这样。
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;
...
}];
设置为我的领域对象,并且还释放与有界对象关联的nil
。
有些时候,当Realm处于写入事务中时会发生这种情况。它崩溃了,因为它正在取消正在运行的线程的不同线程上的写事务。
编辑:
要扩展此问题: - 我有一个ViewModel,它强烈引用了一个RealmObject - 从任何线程的Realm中检索RealmObject - 取消分配ViewModel时: - RealmObject是nilled,导致它被释放,因为它是唯一的强引用 - 这反过来导致该对象的RLMRealm被释放,因为它是对该领域的剩余强引用 - 解除分配领域时检查它是否在写入事务中,如果是,则尝试取消它,导致错误线程崩溃
我认为,如果我删除RAC观察,问题仍然会发生。 我能够通过在main之外的线程中创建一个带有realm对象的viewmodel并调用beginWriteTranscaction然后在主线程中对该对象进行nilling来导致其重新分配,从而强制重现 代码是这样的:
realm
答案 0 :(得分:0)
Realm accessed from incorrect thread
表示您尝试访问在另一个线程上创建的realm实例。正如我在上面的评论中所建议的那样,确保为每个线程初始化一个新的Realm实例,并从该Realm实例中获取对象的新实例。
您唯一需要注意的是,您不能让多个线程共享相同的Realm对象实例。如果多个线程需要访问相同的对象,则每个线程都需要获取自己的实例