You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保KMM应用中Realm MongoDB登出在数据库修改后执行

解决KMM中Realm写事务未完成就执行登出的问题

问题根源

你的代码存在两个可能引发该问题的点:

  1. Realm写事务内存在冗余操作,copyToRealm(user)属于不必要调用,可能干扰事务提交流程
  2. 事务内的空值处理不严谨,可能导致事务提前退出,让登出操作提前执行

修正后的代码

suspend fun doLogout(token: String) {
    val userId = appService.currentUser?.id ?: return // 提前处理用户为空的情况

    // 等待Realm写事务完全提交
    realm.write {
        val user = query<UserInfo>("_id = $0", userId).first().find() ?: return@write
        val tokenIndex = user.FCMToken.withIndex().findLast { it.value == token }?.index ?: return@write
        
        // 直接修改Realm托管对象,无需调用copyToRealm
        findLatest(user)?.FCMToken?.removeAt(tokenIndex)
    }

    // 写事务完成后再执行登出
    appService.currentUser?.logOut()
}

关键说明

  • 移除冗余操作:在Realm的write块中,修改findLatest(user)返回的托管对象属性时,Realm会自动跟踪并提交变更,不需要调用copyToRealm——该方法仅用于将非托管对象存入数据库。
  • 严谨判空:通过?: return或?: return@write提前处理空值,避免空指针异常导致事务流程中断。
  • 执行顺序保障:realm.write是挂起函数,会阻塞当前协程直到事务完全提交,之后才会执行后续的logOut()操作,从逻辑上确保登出操作在数据库修改完成后执行。

内容的提问来源于stack exchange,提问作者DhanDaniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:40:46