如何确保KMM应用中Realm MongoDB登出在数据库修改后执行
解决KMM中Realm写事务未完成就执行登出的问题
问题根源
你的代码存在两个可能引发该问题的点:
- Realm写事务内存在冗余操作,
copyToRealm(user)属于不必要调用,可能干扰事务提交流程 - 事务内的空值处理不严谨,可能导致事务提前退出,让登出操作提前执行
修正后的代码
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
相关产品推荐
相关产品推荐

