Swift调用Kotlin挂起函数报错,如何调整删FCM Token再登出流程?
解决Kotlin挂起函数从Swift调用时的主线程限制问题
问题原因
崩溃的核心原因是:从Swift/Objective-C调用Kotlin挂起函数必须在主线程执行。你的代码中,deleteToken的回调可能在后台线程触发,此时在回调里直接调用doLogout(挂起函数)就会触发这个异常。
解决方案
方案1:Swift回调中切换回主线程调用登出函数
修改Swift的doLogout方法,确保调用doLogout时处于主线程:
func doLogout(){ repo.deleteToken(token: myFCMToken){ error in // 切回主线程执行后续操作 DispatchQueue.main.async { [weak self] in guard let self = self else { return } self.isLoginShown = true // 现在在主线程调用挂起函数,符合要求 self.repo.doLogout(){ _ in // 可添加登出完成后的处理逻辑 } } } }
方案2:Kotlin层合并两个挂起操作
在Kotlin端新增一个组合函数,将删除Token和登出逻辑合并,减少Swift端的跨线程调用:
suspend fun deleteTokenAndLogout(token: String) { deleteToken(token) doLogout() }
然后Swift端只需调用这个合并后的函数:
func doLogout(){ repo.deleteTokenAndLogout(token: myFCMToken){ error in DispatchQueue.main.async { [weak self] in self?.isLoginShown = true } } }
补充说明
- 方案1适合不想修改Kotlin代码的场景,通过Swift的线程调度解决问题;
- 方案2更简洁,将业务逻辑收拢在Kotlin层,避免Swift端的线程管理失误,也让流程更连贯。
内容的提问来源于stack exchange,提问作者dhaval123
相关产品推荐
相关产品推荐

