目前仅支持在主线程上从 Swift/Objective-C 调用 Kotlin 挂起函数

问题描述 投票:0回答:2

我正在尝试删除用户的 fcm 令牌,然后注销。

但我不能这样做,因为我收到错误

'Calling Kotlin suspend functions from Swift/Objective-C is currently supported only on main thread'

似乎挂起函数会挂起下一个块?

repo.deleteToken方法:

 suspend fun deleteToken(token: String) {
        val userId = appService.currentUser!!.id
            realm.write {
                var user = query<UserInfo>("_id = $0", userId).first().find()
                if (user != null) {
                    user = findLatest(user)!!.also {
                        it.FCMToken.remove(token)
                    }
                    copyToRealm(user)
                }
        }
    }

和 repo.logout:

suspend fun doLogout() {
        appService.currentUser?.logOut()
    }

我的注销方法删除令牌并尝试注销:

func doLogout(){
        
        repo.deleteToken(token: myFCMToken){error in
            isLoginShown = true

            repo.doLogout(){error in
                
            }
        }
    }

当我注销时:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Calling Kotlin suspend functions from Swift/Objective-C is currently supported only on main thread'

我知道有一个标志可以避免这种情况,但我不想使用它,我不想冒险改变它。

如何将注销流程改为先删除后注销?

swift swiftui realm kotlin-coroutines kotlin-multiplatform
2个回答
1
投票

如果您不想使用实验性

kotlin.native.binary.objcExportSuspendFunctionLaunchThreadRestriction=none
标志,那么您只有一个选择:在主线程中执行代码,您可以通过将回调包装在
DispatchQueue.main.sync
/
DispatchQueue.main.async
中来实现:

func doLogout() {    
    repo.deleteToken(token: myFCMToken) { error in
        isLoginShown = true
        DispatchQueue.main.async {
            self.repo.doLogout() { error in 
            }
        }
    }
}

了解更多这里


0
投票

这个限制是针对旧的内存模型的。如果您使用新的内存模型,您可以禁用此检查

gradle.properties

kotlin.native.binary.objcExportSuspendFunctionLaunchThreadRestriction=none

如果您有

kotlin
1.7.0+ 和
kotlinx-coroutine
1.6.0+ 而不是
native-mt
-版本,则使用新内存。

更多详细信息请参见:https://youtrack.jetbrains.com/issue/KT-51297/Native-allow-calling-Kotlin-suspend-functions-on-non-main-thread-from-Swift

© www.soinside.com 2019 - 2024. All rights reserved.