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
属性,该属性实际上可以从任何线程访问。您是否访问域对象或代码中其他地方的域?您是否能够不断重现此问题?抱歉,延迟了,我添加了更多关于这个。