【问题标题】:Realm change in change listener更改侦听器中的领域更改
【发布时间】:2016-05-23 13:20:06
【问题描述】:

我尝试使用 Realm 和 Rx 复制数据库触发器功能。一旦我发出 RealmList,我会用它做一些事情并保存。遗憾的是,这会导致 Realm 的更改侦听器再次执行,一遍又一遍地发出列表。

虚拟示例:

realm.where(MyRealmObject.class)
            .equalTo("state", "new")
            .findAll()
            .asObservable()
            .flatMap(new Func1<RealmResults<MyRealmObject>, Observable<MyRealmObject>>() {
                @Override
                public Observable<MyRealmObject> call(RealmResults<MyRealmObject> list) {
                    return Observable.from(list);
                }
            })
            .subscribe(new Action1<MyRealmObject>() {
                @Override
                public void call(final MyRealmObject object) {
                    realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {
                            // do any realm change
                        }
                    });
                }
            });

一旦我在订阅者中提交事务,新的 RealmList 就会从 observable 中发出。我知道为什么会发生这种情况,我只是不知道如何解决这个问题。

这就引出了我的问题。有什么方法可以在我将更改任何领域的领域复制触发器功能?

【问题讨论】:

    标签: android loops triggers realm rx-java


    【解决方案1】:

    可以使用帮助流确定是否应使用 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}    
    

    因此,第一个数据(“开始”)被消耗,并且 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;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2015-05-10
      • 2011-04-26
      相关资源
      最近更新 更多