当调用realmResults.asObservable时?

时间:2017-04-06 15:55:41

标签: android realm rx-java

我正在实施聊天客户端。 每次用户单击Send message按钮 - 我都会执行此消息的Realm插入。

我有服务等待'此更改通过套接字发送此消息。 像这样:

    Observable<RealmResults<RealmMessage>> observable = getUnsentMessages();

    subscribeUnsendMessages = observable
            ...
            .subscribe(message -> {
                launchMessageSending(message);
            });

获取此可观察性的方法如下所示:

public Observable<RealmResults<RealmMessage>> getUnsentMessages() {
    final Realm instance = getRealmInstance();

    return instance.where(RealmMessage.class)
            ...
            .findAllAsync()
                .asObservable()
                .filter(o -> ... )
            .doOnUnsubscribe(instance::close);
}

这就是问题 - 当我大致同时执行两项操作时,有一个极端情况。 第二个看起来像这样:

public boolean shouldTrack(@NonNull RealmChat chat) {

    getRealmInstance().executeTransactionAsync(realm ->{
        RealmTrackedState trackedStates = realm.where(RealmTrackedState.class).findFirst();
        trackedStates.getRealmChats().add(chat);
    });

    return true;
}

上述方法是跟踪缓存,用于记住我是否跟踪了给定的聊天。 (这比这更复杂,请耐心等待。)

PROBABLY 会导致观察者对第二次数据库更改做出反应。 因为这两个操作几乎同时发生 - 第二个通知仍然是有效的&#34;因为有一条未发送的消息。

所以,问题: 我对吗? 如果是这样 - 我该如何处理? 我真的不想延迟&#39; shouldTrack();方法,因为我担心同样的问题会以不同的方式发生。 也许会为这条消息创建一个标记,因此第二个将被忽略 - 但我觉得这有点令人讨厌。第二个发送&#39;不应该发生。

编辑: 这是我的TrackedState对象

public class RealmATrackedState extends RealmObject {

    @PrimaryKey
    private int id = 1;

    private RealmList<RealmChat> realmChats;
    private boolean isSomething;
}

更新此类对象(如上所述)会导致RealmMessage表被通知吗?

0 个答案:

没有答案