IOS上的InvalidMutabilityException使用KotlinMultiplatform中的协程使用可变变量
我简化了错误,我只有这个类:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
string = "Doesn't work"
}
}
}
如果我在主线程(在 IOS 上)上启动 TestClass().testError(),它会抛出一个 InvalidMutabilityException(在 line --> string = "Doesn't work")。所以我认为在创建变量的线程之外的线程上更改变量可能不是一个好主意。所以我改成这样:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
withContext(Dispatchers.Main) { string = "Doesn't work" }
}
}
}
但它仍然抛出一个错误:
kotlin.native.concurrent.InvalidMutabilityException:冻结 com.example.project.TestClass@fe10a8 的突变尝试
顺便一提。上面的两个代码都适用于 Android 端
回答
Kotlin/Native 的线程模型与 JVM 不同。TestClass在 lambda 中捕获数据时被冻结。该string分配默默地捕捉父TestClass并冻结它。
请参阅以下内容:
- https://kotlinlang.org/docs/reference/native/concurrency.html
- https://play.kotlinlang.org/hands-on/Kotlin%20Native%20Concurrency/00_Introduction
- https://www.youtube.com/watch?v=oxQ6e1VeH4M
THE END
二维码