Mvvm 领域与活性可可

Mvvm 领域与活性可可,mvvm,realm,reactive-cocoa,Mvvm,Realm,Reactive Cocoa,我使用的是Realm2.0.4和ReactiveCococa2.5(Objective-CAPI) 我正在尝试使用MVVM 我正在尝试将我的虚拟机“绑定”到底层的RLMObject。我已经做了一些成功的事情。像这样 RACSignal *invalidationSignal = [[[RACObserve(self, boundedProfile.invalidated) takeUntil:self.rac_willDeal

我使用的是
Realm
2.0.4和
ReactiveCococa
2.5(Objective-CAPI)

我正在尝试使用MVVM

我正在尝试将我的虚拟机“绑定”到底层的
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被解除锁定时,我将
nil
设置为我的领域对象,这也解除了与有界对象关联的
realm

这种情况有时发生在写事务的中间。它崩溃是因为它正在运行的线程的另一个线程上取消写事务

编辑:

要详细说明这个问题: -我有一个对RealmObject有强烈引用的ViewModel -该RealmObject是从任何线程的域中检索到的 -解除分配ViewModel时: -RealmObject为nilled,这导致它被释放,因为它是对它的唯一强引用 -这进而导致该对象的RLMRealm被释放,因为它是对该领域的剩余强引用 -解除分配域时,会检查它是否在写事务中,如果在写事务中,则会尝试取消它,从而导致错误线程上的崩溃

我认为,如果我删除RAC观察,问题仍然会发生。 我可以通过在除main和call beginwritetransaction之外的线程中创建一个带有realm对象的viewmodel,然后在主线程中对该对象进行nilling,从而取消分配,从而以强制方式重现这种情况 代码如下所示:

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;
    });
});

从错误线程访问的领域
表示您试图访问在另一个线程上创建的领域实例。正如我在上面的评论中所建议的,请确保为每个线程初始化一个新的领域实例,并从该领域实例获取一个新的对象实例

唯一需要注意的是,不能让多个线程共享同一个领域对象实例。如果多个线程需要访问相同的对象,那么每个线程都需要获得自己的实例


有关详细信息,请参见。

从错误线程访问的领域
表示您试图访问在另一个线程上创建的领域实例。正如我在上面的评论中所建议的,请确保为每个线程初始化一个新的领域实例,并从该领域实例获取一个新的对象实例

唯一需要注意的是,不能让多个线程共享同一个领域对象实例。如果多个线程需要访问相同的对象,那么每个线程都需要获得自己的实例


查看更多信息。

您是否可以共享您收到的错误消息、stacktrace等。另外,请确保为应用程序中的每个线程初始化一个新的Realm实例,请参阅文档中线程部分的更多信息:消息是“从错误线程访问Realm”,下面是stacktrace:您是否可以共享您收到的错误消息,stacktrace等。还要确保为应用程序中的每个线程初始化一个新的领域实例,请参阅文档中线程部分的更多信息:消息是“从错误线程访问领域”,这是stacktrace:这里的问题是我正在将对象绑定到线程中(我没有被警告对象绑定在哪个线程上)。但是所有的解除锁定都发生在主线程中。我不是试图访问对象本身,只是解除锁定。领域对象的解除锁定应该发生在它创建的同一线程上吗?在
RACObserve
(即KVO)的情况下,事件在进行更改的同一个线程上传递。是否在主线程上调用
RACObserve
?我没有强制在主线程上调用
RACObserve
。但是我可以这样做。但是我知道应该在主线程上调用它,以防止在解除锁定时线程不一致。这就是它所要做的吗该怎么办?老实说,我只是想验证一下我的方法是否“正确”,或者如果有更好的方法来实现这一点。我刚刚意识到,在您的示例中,您只使用
invalidated
属性,该属性实际上可以从任何线程访问。您是否访问域对象或代码中其他地方的域?您是否能够不断重现此问题?抱歉,延迟了,我添加了更多关于这里的问题是我将对象绑定在一个线程中(我没有被警告对象绑定在哪个线程上)。但是所有的解除锁定都发生在主线程中。我不是试图访问对象本身,只是解除锁定。领域对象的解除锁定是否应该发生在创建它的同一线程上?在
RACObserve
的情况下(即KVO),事件在进行更改的同一个线程上传递。是否在主线程上调用
RACObserve
?我没有强制在主线程上调用
RACObserve
。但是我可以这样做。但是我知道应该在主线程上调用它,以防止在解除锁定时线程不一致。这就是它所要做的吗该怎么办?老实说,我只是想验证一下我的方法是否“正确”,或者如果有更好的方法来实现这一点。我刚刚意识到,在您的示例中,您只使用
invalidated
属性,该属性实际上可以从任何线程访问。您是否访问域对象或代码中其他地方的域?您是否能够不断重现此问题?抱歉,延迟了,我添加了更多关于这个。