我正在尝试删除用户的 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'
我知道有一个标志可以避免这种情况,但我不想使用它,我不想冒险改变它。
如何将注销流程改为先删除后注销?
如果您不想使用实验性
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
}
}
}
}
了解更多这里。
这个限制是针对旧的内存模型的。如果您使用新的内存模型,您可以禁用此检查
gradle.properties
kotlin.native.binary.objcExportSuspendFunctionLaunchThreadRestriction=none
如果您有
kotlin
1.7.0+ 和 kotlinx-coroutine
1.6.0+ 而不是 native-mt
-版本,则使用新内存。