境界和反应可可

时间:2016-11-22 10:23:42

标签: mvvm realm reactive-cocoa

我正在使用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

1 个答案:

答案 0 :(得分:0)

Realm accessed from incorrect thread表示您尝试访问在另一个线程上创建的realm实例。正如我在上面的评论中所建议的那样,确保为每个线程初始化一个新的Realm实例,并从该Realm实例中获取对象的新实例。

  

您唯一需要注意的是,您不能让多个线程共享相同的Realm对象实例。如果多个线程需要访问相同的对象,则每个线程都需要获取自己的实例

请参阅https://realm.io/docs/objc/latest/#threading