我正在实施聊天客户端。
每次用户单击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表被通知吗?