我尝试使用带有Rx的Realm复制数据库触发器功能。一旦我发出RealmList,我会用它做一些事情并保存。遗憾的是,这导致Realm的更改侦听器再次被执行,一遍又一遍地发出列表。
虚拟例子:
categoryName
一旦我在订阅者中提交了事务,新的RealmList就会从observable中发出。我知道为什么会发生这种情况,我只是没有办法解决这个问题。
这引出了我的问题。有没有办法如何使用领域复制触发器功能,我将进行任何领域更改?
答案 0 :(得分:0)
可以使用辅助流来构建变通方法,确定是否应该使用db中的下一个项目。每个数据存储到db都应该伴随写入帮助器流。下面的运行测试得出:
upstream: IgnoreAction{action='start', ignoreNext=false}
result: 1
result: 2
result: 3
upstream: IgnoreAction{action='1', ignoreNext=true}
upstream: IgnoreAction{action='2', ignoreNext=true}
upstream: IgnoreAction{action='3', ignoreNext=true}
因此,第一个数据(" start")被消耗,onNext中触发的写入被忽略。
@Test
public void rxIgnore() throws Exception {
MockDb mockDb = new MockDb();
BehaviorSubject<Boolean> ignoreNextStream = BehaviorSubject.create(false);
Observable<String> dataStream = mockDb.dataSource();
dataStream.zipWith(ignoreNextStream, Data::new)
.doOnNext(action -> System.out.println("upstream: " + action))
.filter(Data::isTakeNext)
.flatMap(__ -> Observable.just(1, 2, 3))
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer val) {
System.out.println("result: " + val);
ignoreNextStream.onNext(true);
mockDb.data(String.valueOf(val));
}
});
mockDb.data("start");
Observable.empty().delay(1, TimeUnit.MINUTES).toBlocking().subscribe();
}
private static class Data {
private final String action;
private final boolean ignoreNext;
public Data(String action, boolean ignoreNext) {
this.action = action;
this.ignoreNext = ignoreNext;
}
public boolean isTakeNext() {
return !ignoreNext;
}
@Override
public String toString() {
return "IgnoreAction{" +
"action='" + action + '\'' +
", ignoreNext=" + ignoreNext +
'}';
}
}
private static class MockDb {
private final Subject<String, String> subj = PublishSubject.<String>create()
.toSerialized();
public void data(String action) {
subj.onNext(action);
}
Observable<String> dataSource() {
return subj;
}
}